CRM 2011 安全性协商尝试访问 Web 服务的异常
本文关键字:Web 服务 异常 访问 2011 安全性 协商 CRM | 更新日期: 2023-09-27 17:56:58
尝试连接到 CRM 2011 Web 服务时出现意外错误。以下是背景:
连接字符串(已删除敏感信息):"ServiceUri=https://crmdomain.com/OrgName/XRMServices/2011/Organization.svc; Url=https://crmdomain.com/OrgName; Username=appusername; Password=hidden"/>
按如下方式创建连接:
- 将 conn 字符串解析为 CRMConnection:
var conn = Microsoft.Xrm.Client.CrmConnection.Parse(connString);
(此时,CrmConnection
对象中的属性看起来正确,包括客户端凭据) - 创建组织代理:
var orgProxy = new OrganizationServiceProxy(conn.ServiceUri, conn.HomeRealmUri, conn.ClientCredentials, conn.DeviceCredentials);
- 创建数据上下文:
var context = new MyContext(orgProxy);
此时,从 context
检索任何数据时,将发生以下 WCF 异常:
System.ServiceModel.Security.Security协商发生异常 消息 = 调用方未通过服务身份验证。 来源=mscorlib 堆栈跟踪: 服务器堆栈跟踪: at System.ServiceModel.Security.IsissueanceTokenProviderBase'1.DoNegotiation(TimeSpan timeout) at System.ServiceModel.Security.SspiNegotiationTokenProvider.OnOpen(TimeSpan timeout) at System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen(TimeSpan timeout)
。等等。
内部异常显示IsSenderFault=True
和IsPredefinedFault=True
。
这是怎么回事?
我找到了解决方案。首先请下载 CRM SDK 2011 的 RTW 版本。
连接代码将是:
public static IOrganizationService Service()
{
ClientCredentials Credentials = new ClientCredentials();
Credentials.Windows.ClientCredential.UserName ="<username>";
Credentials.Windows.ClientCredential.Password ="<password>";
//This URL needs to be updated to match the servername and Organization for the environment.
Uri OrganizationUri = new Uri("http://<server name>/<organization name>/XRMServices/2011/Organization.svc");
Uri HomeRealmUri = null;
//OrganizationServiceProxy serviceProxy;
using (OrganizationServiceProxy serviceProxy = new OrganizationServiceProxy(OrganizationUri, HomeRealmUri, Credentials, null))
{
IOrganizationService service = (IOrganizationService)serviceProxy;
return service;
}
}
来了...
干杯!享受编码。
您可能希望使用 CRM 跟踪缩小 CRM 中的确切错误范围。您可以使用专用工具激活 CRM 跟踪,并搜索它以获取有关异常来源的更多详细信息。请注意,跟踪文件变得非常大,因此仅在 Web 服务调用期间进行跟踪是合理的。