【问题标题】:Dynamics 365 on premise exception Metadata contains a reference that cannot be resolved:Dynamics 365 本地异常元数据包含无法解析的引用:
【发布时间】:2018-03-24 12:24:37
【问题描述】:

尝试从昨天开始调试我的控制台应用程序,但没有成功。我的脚本一直在抛出:

元数据包含无法解析的引用:'https://xxxxxxx/XRMServices/2011/Organization.svc?wsdl&sdkversion=8.2'。

xxxxxxx 是我的 crm 域的占位符。

我在本地版本 1612(8.2.0.749)(DB 8.2.0.749) 上使用 Dynamics 365。 Dynamics 365 是 IFD。

要创建控制台应用程序,我已经,

1) 使用最新动态365 SDK版本8.2.1.1Microsoft Dynamics 365 SDK

2) 是的,也将这个 sdk 安装到我的 GAC 中。然后重启我的服务器。

3) 为了检查我的组织服务端点是否正确,我还将我的组织服务端点地址 https://xxxxxxx/XRMServices/2011/Organization.svc 粘贴到浏览器中,并通过返回服务来工作。**

4) 我正在使用 Visual Studio 2013,.net 框架 4.5.2

使用 Dynamics 365 在线试用时出现奇怪的问题。

这是我的示例代码:

static void Main(string[] args)
        {

            IOrganizationService organizationservice;
            // Get the CRM connection string and connect to the CRM Organization

            ClientCredentials Credentials = new ClientCredentials();
            Credentials.UserName.UserName = "username";
            Credentials.UserName.Password = "password";

            Credentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials;

            organizationservice = new OrganizationServiceProxy(
                new Uri("https://xxxxxxx/XRMServices/2011/Organization.svc"), null, Credentials, null);

        }

异常抛出:

详情:

System.InvalidOperationException was unhandled
HResult=-2146233079
Message=Metadata contains a reference that cannot be resolved: 
'https://xxxxxxx/XRMServices/2011/Organization.svc?wsdl&sdkversion=8.2'.
Source=System.ServiceModel
StackTrace:
   at System.ServiceModel.Description.MetadataExchangeClient.MetadataRetriever.Retrieve(TimeoutHelper timeoutHelper)
   at System.ServiceModel.Description.MetadataExchangeClient.ResolveNext(ResolveCallState resolveCallState)
   at System.ServiceModel.Description.MetadataExchangeClient.GetMetadata(MetadataRetriever retriever)
   at System.ServiceModel.Description.MetadataExchangeClient.GetMetadata(Uri address, MetadataExchangeClientMode mode)
   at Microsoft.Xrm.Sdk.Client.ServiceMetadataUtility.RetrieveServiceEndpointMetadata(Type contractType, Uri serviceUri, Boolean checkForSecondary)
   at Microsoft.Xrm.Sdk.Client.ServiceConfiguration`1..ctor(Uri serviceUri, Boolean checkForSecondary)
   at Microsoft.Xrm.Sdk.Client.OrganizationServiceConfiguration..ctor(Uri serviceUri, Boolean enableProxyTypes, Assembly assembly)
   at Microsoft.Xrm.Sdk.Client.ServiceConfigurationFactory.CreateConfiguration[TService](Uri serviceUri, Boolean enableProxyTypes, Assembly assembly)
   at Microsoft.Xrm.Sdk.Client.ServiceConfigurationFactory.CreateConfiguration[TService](Uri serviceUri)
   at Microsoft.Xrm.Sdk.Client.ServiceProxy`1..ctor(Uri uri, Uri homeRealmUri, ClientCredentials clientCredentials, ClientCredentials deviceCredentials)
   at Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy..ctor(Uri uri, Uri homeRealmUri, ClientCredentials clientCredentials, ClientCredentials deviceCredentials)
   at ConsoleConnectToCRM.Program.Main(String[] args) in d:\CRM2015\SSIS\TestCRMConnection\TestCRMConnection\Program.cs:line 45
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()
   InnerException: System.Net.WebException
   HResult=-2146233079
   Message=The underlying connection was closed: An unexpected error occurred on a receive.
   Source=System
   StackTrace:
        at System.Net.HttpWebRequest.GetResponse()
        at System.ServiceModel.Description.MetadataExchangeClient.MetadataLocationRetriever.DownloadMetadata(TimeoutHelper timeoutHelper)
        at System.ServiceModel.Description.MetadataExchangeClient.MetadataRetriever.Retrieve(TimeoutHelper timeoutHelper)
   InnerException: System.ComponentModel.Win32Exception
        HResult=-2147467259
        Message=The client and server cannot communicate, because they do not possess a common algorithm
        Source=System
        ErrorCode=-2147467259
        NativeErrorCode=-2146893007
        StackTrace:
             at System.Net.SSPIWrapper.AcquireCredentialsHandle(SSPIInterface SecModule, String package, CredentialUse intent, SecureCredential scc)
             at System.Net.Security.SecureChannel.AcquireCredentialsHandle(CredentialUse credUsage, SecureCredential& secureCredential)
             at System.Net.Security.SecureChannel.AcquireClientCredentials(Byte[]& thumbPrint)
             at System.Net.Security.SecureChannel.GenerateToken(Byte[] input, Int32 offset, Int32 count, Byte[]& output)
             at System.Net.Security.SecureChannel.NextMessage(Byte[] incoming, Int32 offset, Int32 count)
             at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
             at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
             at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
             at System.Net.TlsStream.CallProcessAuthentication(Object state)
             at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
             at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
             at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
             at System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result)
             at System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size)
             at System.Net.PooledStream.Write(Byte[] buffer, Int32 offset, Int32 size)
             at System.Net.ConnectStream.WriteHeaders(Boolean async)
        InnerException: 

提前致谢。

【问题讨论】:

  • 您可以利用 Microsoft.Xrm.Tooling.Connector msdn.microsoft.com/en-us/library/dn689019.aspx
  • 谢谢,好的,我知道 Microsoft.Xrm.Client.dll 已被弃用,但仍然可以使用。奇怪的是,当我使用与上面相同的代码在 CRM 服务器中运行我的控制台应用程序时,它工作正常。然而,它在数据库服务器中运行时返回相同的异常。我认为我的数据库服务器某处有问题。很奇怪。

标签: c# .net console-application dynamics-365


【解决方案1】:

当我将应用程序升级到 CRM365 时,我不得不改变建立连接的方式。这就是我正在使用的

string crmConnectionString = $@"Url=https://<domain>;
    AuthType=Office365;
    UserName=<username>;
    Password=" + <password>;
CrmServiceClient crmSvcClient = new CrmServiceClient(crmConnectionString);
OrganizationServiceProxy proxy = crmSvcClient.OrganizationServiceProxy;
proxy.EnableProxyTypes();
OrganizationServiceContext orgContext = new OrganizationServiceContext(proxy);

这不是前提条件,所以我不肯定它会起作用。但连接字符串必须指定AuthType,并且需要使用CrmServiceClient进行连接。

【讨论】:

  • 感谢史蒂夫,是的,在线版本可以正常工作。我在前提下尝试过,但无济于事。我怀疑我的数据库服务器有问题,因为在 CRM 中,控制台应用程序运行没有这样的问题。
【解决方案2】:

当客户端计算机无法发送 HTTP 请求时会出现此问题。客户端计算机无法发送 HTTP 请求,因为连接已关闭或不可用。今天我意识到我的数据库服务器使用TLS1.2而不是SSL作为连接到CRM应用服务器的协议,所以当通过console app从数据库连接到CRM时,我必须在服务点管理器。只需在调用 CRM 组织服务之前随时运行此代码即可。

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

希望这对将来的某人有所帮助。

【讨论】:

    【解决方案3】:

    我们已将 IServiceManagement 用于 crm 版本 2011 及更高版本。 F# 中的一个示例如下所示 - 它几乎直接转换为 C#。

    let authenticate uri username password domain =
      let m = ServiceConfigurationFactory.CreateManagement<IOrganizationService(uri)
      let cred = AuthenticationCredentials()
      cred.ClientCredentials.Windows.ClientCredential <- 
        new NetworkCredential(username, password, domain)
      let ac = m.Authenticate(cred)
      let proxy = new OrganizationServiceProxy(m, ac.ClientCredentials)
      proxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
      proxy
    

    【讨论】:

    • 谢谢,不要认为设置连接的方式会导致这里出现问题。我担心我的数据库服务器有问题,导致在我的 CRM 服务器中为控制台应用程序使用相同的代码,猜猜,它工作正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    相关资源
    最近更新 更多