我通过此代码使用组织服务成功连接到内部部署服务器。
using (OrganizationServiceProxy proxy = new OrganizationServiceProxy(
Organization,
HomeRealm,
CredentialsForClient,
CredentialsForDevice)) { ... }
Organization
是我们的服务器加上后缀OrgName/XRMServices/2011/Organization.svc
。 CredentialsForClient
是我的登录(或者我在线时的实时ID)。 HomeRealm
和CredentialsForDevice
设置为null
。
这似乎完全适用于内部部署版本,但当我上线时,我收到错误。我可以创建proxy
变量但是当我尝试执行下面的代码时,异常告诉我,我不能将null
值作为终点。由于我的无知,这几乎没有告诉我任何事情。
EntityCollection entityCollection = proxy.RetrieveMultiple(fetchExpression);
当然,我在网上使用不同的Organization
。我从我们的CRM Dynamics在线版本的设置中复制了字符串(正如我对内部部署版本所做的那样)。我该如何解决这个问题?
答案 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所需的各种值(对于这两种环境。)