从外部MVC应用程序中的CrmOrganizationServiceContext获取OrganizationServiceProxy

时间:2013-12-19 12:50:57

标签: c# dynamics-crm-2011

我希望能够在我的

上设置来电显示
XrmServiceContext : Microsoft.Xrm.Client.CrmOrganizationServiceContext

使用svcutil.exe为crm生成的上下文。

据我所知,我无法在现有连接上执行此操作,我需要首先创建一个OrganizationServiceProxy实例设置Call​​erID,然后将其作为参数传递给新的XrmServiceContext然后我可以改用。

然而,我有点被困在我如何从CrmOrganizationServiceContext转到OrganizationServiceProxy

该程序是一个单独的.Net4.5应用程序

任何有用的提示或链接?


修改:发布此内容后发现此页面:http://msdn.microsoft.com/en-us/library/gg695810.aspx

所以它可能很简单:

    var connection = new CrmConnection("Xrm");
    connection.CallerId = uide;
    _serviceContext = new XrmServiceContext(connection);

编辑2 :这不是那么简单。 这样做不会改变我收到的数据。

    CrmConnection connection = new CrmConnection("Xrm");
    connection.CallerId = Guid.NewGuid();//u.Id;

    _serviceContext = new XrmServiceContext(connection);

它编译并且没有崩溃但我怀疑当我使用具有非常低的权限但仍然获得所有数据的用户的id时,我然后尝试为XrmServiceContext的每个实例生成新的Guid但我仍然把一切都归还。所以我猜它没有被使用..或者我错过了其他的东西。

编辑3 在设置WhoAmIRequest后执行CallerID仍会返回在连接字符串中设置的同一用户。

编辑4 似乎我的问题与缓存有关。 在我的实现中,我需要首先调用服务上下文来找出我想要模仿的用户的Guid。此调用不会设置CallerID。如果我跳过这个初始查询并从头开始设置一个特定的Guid,那么CallerID就可以了。我猜这是因为服务上下文缓存了我原来的CallerId或类似的东西。

现在我只需要弄清楚如何清除CRM 2013 SDK中的缓存。

编辑5 通过使用本指南完整地关闭缓存:http://msdn.microsoft.com/en-us/library/gg695805.aspx我已经让它工作了。但是,如果我能在我需要的一点清除它而不是完全禁用它,我会更喜欢。

如果有人可以告诉我如何使用代码清空服务上下文缓存,我会将其标记为正确的解决方案

2 个答案:

答案 0 :(得分:3)

在处理“_serviceContext

时,可以使用一种方法

您应该能够使用:_serviceContext.ClearChanges();这将清除Cache中特定实体的所有跟踪。 See the Public Methods Section

答案 1 :(得分:1)

此问题与instanceMode部分下的web.config中定义的默认microsoft.xrm.client有关。

默认情况下,该设置设置为 PerRequest

  

PerRequest - 在Web上下文中返回相同的第一个实例   请求,例如。每个HttpContext实例的一个实例。

因此,在这种情况下,当您进行初始调用以确定要将CallerId设置为哪个用户时,该实例正在被缓存' (缺少更好的词)和同一请求中的子请求调用,即使您要创建新的XrmServiceContext

,也会返回此实例

解决方案是将instanceMode更改为 PerInstance

  

PerInstance - 在每次调用时返回一个新实例。

修改您的web.config,以便正确指定instanceMode属性

 <microsoft.xrm.client>
    <contexts>
      <add name="Xrm" type="Xrm.XrmServiceContext, Xrm" serviceName="Xrm" />
    </contexts>
    <services>
      <add name="Xrm" type="Microsoft.Xrm.Client.Services.OrganizationService, Microsoft.Xrm.Client" instanceMode="PerInstance" />
    </services>
  </microsoft.xrm.client>

在JensB在其第5次编辑中发布的文章中找到此信息:http://msdn.microsoft.com/en-us/library/gg695805.aspx