在线连接到CRM Dynamics时应用OrganizationServiceProxy

时间:2012-09-20 12:18:59

标签: dynamics-crm dynamics-crm-online

我通过此代码使用组织服务成功连接到内部部署服务器。

using (OrganizationServiceProxy proxy = new OrganizationServiceProxy(
  Organization, 
  HomeRealm, 
  CredentialsForClient, 
  CredentialsForDevice)) { ... }

Organization是我们的服务器加上后缀OrgName/XRMServices/2011/Organization.svcCredentialsForClient是我的登录(或者我在线时的实时ID)。 HomeRealmCredentialsForDevice设置为null

这似乎完全适用于内部部署版本,但当我上线时,我收到错误。我可以创建proxy变量但是当我尝试执行下面的代码时,异常告诉我,我不能将null值作为终点。由于我的无知,这几乎没有告诉我任何事情。

EntityCollection entityCollection = proxy.RetrieveMultiple(fetchExpression);

当然,我在网上使用不同的Organization。我从我们的CRM Dynamics在线版本的设置中复制了字符串(正如我对内部部署版本所做的那样)。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

您是否看过这个示例,它展示了Authenticate Users with Microsoft Dynamics CRM Web Services如何在没有任何帮助代码的情况下为所有类型的连接,内部部署,联机。

答案 1 :(得分:1)

连接到在线版本时,您必须提供设备凭据以及用户凭据。就是它的方式(Windows实时身份验证方案和所有。)

修改

经过一些研究,我仍然没有找到官方文件,说明为什么会这样。通常,在MSDN论坛上,接受这是将设备身份与Windows Live相关联。也许这是微软可以跟踪哪些工作站正在使用CRM?也许通过限制哪些机器身份可以使用某些帐户连接到CRM,它们可以在某些时候增强安全性。也许以上所有/都没有。

除此之外,根据我的经验,如果没有针对CRM进行身份验证的设备凭据(即通过OrganizationServiceProxy构造函数或IServiceManagment实现使用的身份验证过程),我无法执行成功的查询。)

下面,您将找到我用来执行此操作的一些旧代码。我现在建议使用@Jason Lattimer提到的连接字符串。如果您需要处理更多并行性,请查看使用IServiceManagement<IOrganizationService>

    var reader = new AppSettingsReader();

    //instatantiate credential class and populate values
    var cc = new ClientCredentials();
    cc.UserName.UserName = reader.GetValue("WLID", typeof(string)).ToString();
    cc.UserName.Password = reader.GetValue("WLPS", typeof(string)).ToString();

    //repeat for device credentials
    var deviceCredentials = new ClientCredentials();
    deviceCredentials.UserName.UserName = reader.GetValue("deviceWLID", typeof(string)).ToString();
    deviceCredentials.UserName.Password = reader.GetValue("deviceWLPS", typeof(string)).ToString();


    //create a uri for the organization service location
#if DEBUG
    var orgServiceUri = new Uri(reader.GetValue("CrmNonProductionUri", typeof(string)).ToString());
#else
    Uri orgServiceUri = new Uri(reader.GetValue("CrmProductionUri", typeof(string)).ToString());
#endif
    OrganizationServiceProxy retval = new OrganizationServiceProxy(orgServiceUri, null, cc, deviceCredentials);
    retval.EnableProxyTypes();

所以,最后,我只使用配置文件来存储构建我的凭据和uri所需的各种值(对于这两种环境。)