MS Dynamics SDK returning quot;Cannot access a disposed objectquot;(返回Quot;的MS Dynamics SDK无法访问已处置的对象Quot;)
问题描述
在我们的.NET项目中,我们使用Dynamics SDK(版本8.2.0.2)从我们的网站访问Dynamics 365。我们使用CrmSvcUtil工具生成要使用的早期绑定类。在我们的依赖项解析器中,每当请求IOrganizationService时,我们都会注入到Dynamics的连接,如下所示:
container.For<IOrganizationService>()
            .Singleton()
            .Use(ctx => new OrganizationService(new CrmConnection("CrmConnection")));
在我们处理与Dynamics通信的类中,我们的构造函数被创建为将IOrganizationService的实例注入其中,如下所示:
        private readonly IOrganizationService _organizationService;
    private readonly ILog _logger;
    public CrmAccount(IOrganizationService organizationService, ILog logger)
    {
        _organizationService = organizationService;
        _logger = logger;
    }
在这个类中,我们有各种方法。例如,其中一个更新用户联系记录。出于本文的目的,我已经将该方法设置得很小,即我没有显示我们正在更新的所有属性,但是代码的结构保持不变:
        public Guid? SetProfile(string username)
    {
        using (var xrm = new XrmServiceContext(_organizationService))
        {
            //check whether account already exists
            var crmProfile = GetContact(xrm, username);
            if (crmProfile == null)
            {
                //create new account if required
                crmProfile = new Contact
                {
                    EMailAddress1 = profile.Username,
                };
                xrm.AddObject(crmProfile);
            }
            else
            {
                //update existing account
                crmProfile.EMailAddress1 = profile.Username;
                xrm.UpdateObject(crmProfile);
            }
            var response = xrm.SaveChanges();
            if (!response.HasError) return crmProfile.Id;
            foreach (var result in response)
            {
                if (result.Error != null)
                {
                    _logger.ErrorFormat("Failed to create Profile record for Profile with guid {0}:/r/n{1}", crmProfile.Id, result.Error.Message);
                }
            }
            return crmProfile.Id;
        }
    }
我们看到的问题是,当多个用户尝试同时调用此方法时,在调用xrm.SaveChanges()方法时,我们会收到错误消息"Cannot Access a Disposed Object"。
我意识到将我们的代码包装在Using语句中意味着当到达最后一个大括号时将释放对象,但我也假设每次调用此方法都会创建其自己的OrganizationService实例,因此该对象永远不会被释放在单个用户调用此方法的范围内。
我是不是遗漏了什么明显的东西?毕竟,这是微软建议针对Dynamics执行事务的方式。
提前感谢您抽出时间。
向您致以亲切的问候
dotdev
推荐答案
您的IoC容器提供了一个IOrganizationService对象作为单例。这意味着每个请求实际上使用一个相同的实例。但是,一个OrganizationService实例不能同时由多个线程使用。
对于使用Dynamics CRM作为后端存储的Web服务,一个好的选择可能是设计一个IOrganizationService实例池。每个请求从池中获取一个实例,执行其任务,最后将IOrganizationService实例返回到池,在那里它将可供重用。
这篇关于返回&Quot;的MS Dynamics SDK无法访问已处置的对象&Quot;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:返回&Quot;的MS Dynamics SDK无法访问已处置的对象&Quot;
				
        
 
            
        - 输入按键事件处理程序 2022-01-01
 - 良好实践:如何重用 .csproj 和 .sln 文件来为 CI 创建 2022-01-01
 - C# 中多线程网络服务器的模式 2022-01-01
 - MoreLinq maxBy vs LINQ max + where 2022-01-01
 - Web Api 中的 Swagger .netcore 3.1,使用 swagger UI 设置日期时间格式 2022-01-01
 - C#MongoDB使用Builders查找派生对象 2022-09-04
 - 在哪里可以找到使用中的C#/XML文档注释的好例子? 2022-01-01
 - 如何用自己压缩一个 IEnumerable 2022-01-01
 - 带有服务/守护程序应用程序的 Microsoft Graph CSharp SDK 和 OneDrive for Business - 配额方面返回 null 2022-01-01
 - WebMatrix WebSecurity PasswordSalt 2022-01-01
 
						
						
						
						
						
				
				
				
				