65.9K
CodeProject 正在变化。 阅读更多。
Home

时钟不正确时无法连接

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2018 年 5 月 27 日

CPOL

2分钟阅读

viewsIcon

7252

时钟不正确时无法连接

可能,这篇文章的标题已经很好地概括了问题,但仍然有一些细节值得解释。我正在开发一个 Azure Function 应用,它基本上是在 CRM 和另一个系统之间集成数据。该应用程序的主要功能已经完成并经过测试。两周前,当我休假回来时,我发现我的应用程序,在之前运行良好,现在无法连接到 CRM。我正在使用 Microsoft.Xrm.Tooling 程序集和以下代码,但现在它开始返回 null

public static IOrganizationService GetOrganizationService(ref TraceWriter log)
{
    IOrganizationService _orgService = null;
    string connectionstring = ConfigurationManager.AppSettings["connectionstring"].ToString();
    CrmServiceClient conn = new Microsoft.Xrm.Tooling.Connector.CrmServiceClient(connectionstring);
    _orgService = (IOrganizationService)conn.OrganizationWebProxyClient != null
                ? (IOrganizationService)conn.OrganizationWebProxyClient
                : (IOrganizationService)conn.OrganizationServiceProxy;

    return _orgService;
}

CrmServiceClient 有两个非常有用的属性 LastCRMErrorLastCRMException,它们显示了以下错误消息

无法登录到 Dynamics CRMOrganizationWebProxyClientnullOrganizationServiceProxynull

尝试寻找解决方案,并找到了以下建议

  1. 在连接字符串中,尝试使用组织唯一名称而不是友好名称
  2. 可能是程序集版本不兼容,或者代码/连接字符串应该以不同的方式编写
  3. 在连接之前使用 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

但这些方法都没有在我的情况下起作用。我联系了微软支持,他们确认没有可能导致此问题的更新或发布,但好消息是他们仍然愿意提供帮助。 🙂

我尝试了不同类型的应用程序、环境和版本,但都没有成功。

最后,在测试以下代码时,错误信息变得更有意义

IServiceManagement orgServiceManagement 
   = ServiceConfigurationFactory.CreateManagement
     (new Uri("https://myCrmInstance.crm5.dynamics.com/XRMServices/2011/Organization.svc"));

AuthenticationCredentials authCredentials = new AuthenticationCredentials();
authCredentials.ClientCredentials.UserName.UserName = "user@email.com";
authCredentials.ClientCredentials.UserName.Password = "*********";
AuthenticationCredentials tokenCredentials = orgServiceManagement.Authenticate(authCredentials); 
OrganizationServiceProxy organizationProxy = new OrganizationServiceProxy(orgServiceManagement,
                                             tokenCredentials.SecurityTokenResponse);

Entity contact = new Entity("contact");
contact.Attributes["firstname"] = "Yawer";
contact.Attributes["lastname"] = "Iqbal";

var contactId = organizationProxy.Create(contact)

“安全时间戳无效,因为其创建时间(‘2018-04-01T12:30:45.790Z’)在未来。当前时间是‘2018-04-01T12:24:29.185Z’,允许的时钟偏差是‘00:05:00’。”

从时间提示中,我发现我的机器时间落后了 6 分钟。是什么导致了时间变化,我仍然不知道,但由于只有 6 分钟的差异,我没有注意到这个变化。我校正了时间,一切都恢复了正常。我想做个小实验,将时钟提前 6 分钟,正如预期的那样,错误不同了

从另一方收到了未安全或未正确保护的错误。请参阅内部 FaultException 以获取错误代码和详细信息。

以及内部异常

在验证消息的安全性时发生错误。

希望分享能节省大家的时间。

© . All rights reserved.