Dynamics crm 在线连接到CRM Dynamics时应用OrganizationServiceProxy

Dynamics crm 在线连接到CRM Dynamics时应用OrganizationServiceProxy,dynamics-crm,dynamics-crm-online,Dynamics Crm,Dynamics Crm Online,通过此代码,我正在使用组织服务成功连接到内部部署服务器 使用(OrganizationServiceProxy=new OrganizationServiceProxy)( 组织,, 家园, 客户证书, 设备的凭证({…} Organization是我们的服务器加上后缀OrgName/XRMServices/2011/Organization.svcCredentialsForClient是我的登录(或在线时的live ID)HomeRealm和CredentialsForDevice设置为n

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

使用(OrganizationServiceProxy=new OrganizationServiceProxy)(
组织,,
家园,
客户证书,
设备的凭证({…}
Organization
是我们的服务器加上后缀
OrgName/XRMServices/2011/Organization.svc
CredentialsForClient
是我的登录(或在线时的live ID)
HomeRealm
CredentialsForDevice
设置为
null

这似乎对内部版本非常有效,但当我联机时,会出现一个错误。我可以创建
proxy
变量,但是当我尝试执行下面的代码时,异常告诉我不能将
null
值作为终点。由于我的无知,这几乎没有告诉我任何事情

EntityCollection EntityCollection=proxy.RetrieveMultiple(fetchExpression);

当然,我上网时使用的是不同的
组织。我从在线版本的CRM Dynamics的设置中复制了这个字符串(就像我对内部版本所做的那样)。如何解决此问题?

您可能需要下载最新版本的SDK,并查看示例:。本地和联机连接字符串不同

[<add name="Server=CRM Online, organization=YourOrg, user=YourUserName"
         connectionString="Url=https://YourOrg.crm.dynamics.com; Username=YourUserName@YourOrg.onmicrosoft.com; Password=YourPassword"/>][2]
[]2]

您是否看过此示例,它显示了如何在没有任何帮助程序代码的情况下,对所有类型的连接、本地连接和在线连接进行操作。

当连接到在线版本时,您必须提供设备凭据和用户凭据。就是这样(Windows live身份验证方案和所有)

编辑

经过一些研究,我仍然没有找到关于为什么会这样的官方文件。通常情况下,在MSDN论坛上,可以认为这是向windows live提供设备标识。也许这是为了让Microsoft能够跟踪哪些工作站正在使用CRM?也许这使他们能够通过限制哪些机器身份可以使用某些帐户连接到CRM,从而在某个时候增强安全性。也许以上所有/没有

抛开猜测不谈,根据我的经验,如果没有针对CRM进行身份验证的设备凭据(即通过
OrganizationServiceProxy
构造函数或iServiceMagment实现使用的身份验证过程),我无法成功执行查询

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


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

我不确定是否完全遵循了。看起来,
名称
由服务器、组织和用户组成,而
连接字符串
由url、用户名和密码组成。。。这两个属性中都会提到一些细节——应该是这样吗?另外,这是联机版本还是本地版本的连接字符串?请注意,我对此非常陌生,并且非常困惑。我还发现了一个描述如何获取设备凭据的示例,但我仍然发现关于不安全或错误安全连接的错误。我认为Jason建议您使用Microsoft提供的帮助程序库来帮助建立连接,我在他的帖子中添加了一个链接。+1用于建议简化与Microsoft Dynamics CRM的连接!然而,它回避了两个问题。为什么我们需要对设备进行身份验证,这解决了什么问题?而且,我还设法在不向光盘写入任何内容的情况下进行在线身份验证。我只向服务器发送一组随机字符,它会给我全新的凭据。如果我可以随时拿到我的证件,那又有什么意义呢?这感觉有点像要求某人选择一个代码,然后立即要求它。很明显他/她知道这一点!这纯粹是猜测,因为我找不到支持文档,但我相信这与作为windows live id模式一部分的设备标识有关。当您从其他计算机访问windows live帐户时,它至少知道正在进行访问的设备。我认为您可以在windows live帐户上为受信任的设备设置安全性。再说一次,只是猜测。根据我的经验,在使用windows live进行身份验证(或与CRM Online一起使用)时,我总是必须发送设备的凭据才能执行查询。我确实发现:这表明(CRM?)SDK是一致的。在针对windows live进行身份验证时,该帐户应(必须?)匹配用于访问该帐户的设备。酷。挖得好!“就这样做”是一件令人烦恼的事。我很想知道为什么事情是以某种方式进行的。(顺便说一句,这是发现冗余和多余的一个很好的方法。)
    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();