Dynamics crm CrmServiceClient始终返回空的组织服务

Dynamics crm CrmServiceClient始终返回空的组织服务,dynamics-crm,dynamics-crm-2016,dynamics-365-sales,Dynamics Crm,Dynamics Crm 2016,Dynamics 365 Sales,我有以下代码连接到Dynamics 365 Online组织。它在orgService.Execute(new WhoAmIRequest())上引发空引用异常和错误日志位于代码下方。我已经在两台使用不同控制台应用程序的机器上尝试过了。我已经尝试了8.2和8.0 SDK DLL。如果我使用CrmConnection和7.x SDK DLL重写这个,一切都会正常工作。我可以使用相同的凭据浏览到组织(剪切和粘贴以确保没有输入错误) 连接字符串格式取自以下示例: 使用Office 365的命名帐户

我有以下代码连接到Dynamics 365 Online组织。它在
orgService.Execute(new WhoAmIRequest())上引发空引用异常和错误日志位于代码下方。我已经在两台使用不同控制台应用程序的机器上尝试过了。我已经尝试了8.2和8.0 SDK DLL。如果我使用
CrmConnection
和7.x SDK DLL重写这个,一切都会正常工作。我可以使用相同的凭据浏览到组织(剪切和粘贴以确保没有输入错误)

连接字符串格式取自以下示例:

使用Office 365的命名帐户

基本代码

var connectionString=@“Url=https://ORGNAME.crm.dynamics.com;用户名=username@ORGNAME.onmicrosoft.com;Password=43JF##$j#@Ha;Authype=Office365;“;
var client=新的CrmServiceClient(connectionString);
var orgService=(IOOrganizationService)client.OrganizationWebProxyClient??client.OrganizationServiceProxy;
Execute(new WhoAmIRequest());
错误日志输出:

Microsoft.Xrm.Tooling.Connector.CrmServiceClient Information: 8 : Discovery URI is = https://ORGNAME.crm.dynamics.com:443/XRMServices/2011/Discovery.svc
Microsoft.Xrm.Tooling.Connector.CrmServiceClient Information: 8 : DiscoverOrganizations - Initializing Discovery Server Object with https://ORGNAME.crm.dynamics.com/XRMServices/2011/Discovery.svc
Microsoft.Xrm.Tooling.Connector.CrmServiceClient Verbose: 16 : DiscoverOrganizations - attempting to connect to CRM server @ https://ORGNAME.crm.dynamics.com/XRMServices/2011/Discovery.svc
Microsoft.Xrm.Tooling.Connector.CrmServiceClient Error: 2 : Source  : System.ServiceModel
Method  : Retrieve
Date    : 2/13/2017
Time    : 5:42:37 PM
Error   : Metadata contains a reference that cannot be resolved: 'https://ORGNAME.crm.dynamics.com/_common/error/errorhandler.aspx?BackUri=&ErrorCode=&Parm0=%0d%0a%0d%0aتفاصيل الخطأ: The service '%2fXRMServices%2f2011%2fDiscovery.svc' cannot be activated due to an exception during compilation.  The exception message is: Could not load file or assembly 'Microsoft.Crm.Site.Services%2c Version%3d8.0.0.0%2c Culture%3dneutral%2c PublicKeyToken%3d31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified..&RequestUri=%2fXRMServices%2f2011%2fDiscovery.svc%3fwsdl%26sdkversion%3d8.1&user_lcid=1025'.
Stack Trace : 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.ServiceConfigurationFactory.CreateManagement[TService](Uri serviceUri, Boolean enableProxyTypes, Assembly assembly)
   at Microsoft.Xrm.Sdk.Client.ServiceConfigurationFactory.CreateManagement[TService](Uri serviceUri)
   at Microsoft.Xrm.Tooling.Connector.CrmWebSvc.CreateAndAuthenticateProxy[T](IServiceManagement`1 servicecfg, Uri ServiceUri, Uri homeRealm, ClientCredentials userCredentials, ClientCredentials deviceCredentials, String LogString)
   at Microsoft.Xrm.Tooling.Connector.CrmWebSvc.DiscoverOrganizations(Uri discoveryServiceUri, Uri homeRealmUri, ClientCredentials clientCredentials, ClientCredentials deviceCredentials)
   at Microsoft.Xrm.Tooling.Connector.CrmWebSvc.DiscoverOrganizations(Uri discoveryServiceUri, Uri homeRealmUri, NetworkCredential networkCredential)
   at Microsoft.Xrm.Tooling.Connector.CrmWebSvc.InitCRM2011Service()
======================================================================================================================
Inner Exception Level 1 : 
Source  : System.Runtime.Serialization
Method  : ThrowXmlException
Date    : 2/13/2017
Time    : 5:42:37 PM
Error   : CData elements not valid at top level of an XML document. Line 1, position 3.
Stack Trace : at System.Xml.XmlExceptionHelper.ThrowXmlException(XmlDictionaryReader reader, XmlException exception)
   at System.Xml.XmlUTF8TextReader.Read()
   at System.ServiceModel.Description.MetadataExchangeClient.MetadataLocationRetriever.GetXmlReader(HttpWebResponse response, Int64 maxMessageSize, XmlDictionaryReaderQuotas readerQuotas)
   at System.ServiceModel.Description.MetadataExchangeClient.MetadataLocationRetriever.DownloadMetadata(TimeoutHelper timeoutHelper)
   at System.ServiceModel.Description.MetadataExchangeClient.MetadataRetriever.Retrieve(TimeoutHelper timeoutHelper)
======================================================================================================================

Microsoft.Xrm.Tooling.Connector.CrmServiceClient Error: 2 : Unable to Login to Dynamics CRM
Microsoft.Xrm.Tooling.Connector.CrmServiceClient Error: 2 : OrganizationWebProxyClient is null
Microsoft.Xrm.Tooling.Connector.CrmServiceClient Error: 2 : OrganizationServiceProxy is null

您是否尝试过将参数直接传递给CrmServiceClient而不是连接字符串

我可以使用以下方法成功连接到Dynamics365

public CrmServiceClient(string crmUserId, SecureString crmPassword, string crmRegion, string orgName, bool useUniqueInstance = false, bool useSsl = false, OrganizationDetail orgDetail = null, bool isOffice365 = false);
我是这样申请的

var pwd = ConvertToSecureString("userpassword");
CrmServiceClient client = new CrmServiceClient("user@mail.com", pwd, "NorthAmerica", "orgname", isOffice365: true);
下面是将密码转换为安全字符串的方法

private System.Security.SecureString ConvertToSecureString(string password)
{
    if (password == null)
        throw new ArgumentNullException("missing pwd");

    var securePassword = new System.Security.SecureString();
    foreach (char c in password)
        securePassword.AppendChar(c);

    securePassword.MakeReadOnly();
    return securePassword;
 }

根据微软的最新建议,我们不应该使用“AuthType=Office365”

我们可以使用应用程序帐户(客户端ID和密钥)生成令牌和访问Dynamics CRM组织服务。但是如果您想使用用户ID&PWD,那么就使用(AuthType=OAuth)

示例代码:

字符串连接string=“AuthType=OAuth;Url=”https://******.crm.dynamics.com';用户名=””;密码=””;AppId=51f81489-12ee-4a9e-aaae-a2591f45987d;重定向URI=app://58145B91-0C36-4500-8554-080854F2AC97;LoginPrompt=Never”

ServicePointManager.SecurityProtocol=SecurityProtocolType.Tls12

CrmServiceClient CrmServiceClient=新的CrmServiceClient(connectionString); WhoAmIResponse WhoAmIResponse=crmServiceClient.Execute(new WhoAmIRequest())为WhoAmIResponse

注意:在尝试使用Azure函数时,我遇到以下错误:

  • 从身份验证上下文请求令牌时出错需要非空权限
  • 出现一个或多个错误。=>发送请求时出错。=>基础连接已关闭:发送时发生意外错误。=>无法从传输连接读取数据:远程主机强制关闭了现有连接。=>从身份验证上下文请求令牌的远程hostERROR强制关闭了现有连接
  • CurrentAccessToken='crmServiceClient.CurrentAccessToken'引发了类型为'System.NullReferenceException'的异常
  • 只需使用一行代码即可轻松解决这些问题:ServicePointManager.SecurityProtocol=SecurityProtocolType.Tls12

    参考URL:
    Microsoft Dynamics 365客户参与(在线)要求TLS 1.2用于连接

    请让我知道你是否面临任何其他问题

    谢谢, Sumit

    我出错了

    Unable to login to Dynamics CRM, Error was :                    
    Data[0] = "The provided uri did not return any Service Endpoints!   
    
    我在尝试使用AuthType=ClientSecret的连接字符串连接到Dynamics时收到此错误。之前,我使用用户名和密码以及表单的连接字符串成功连接

    "Url={dynamicsConnectionString};Username={username};Password={password};AuthType=Office365;"
    
    连接字符串已更改为具有以下格式:

    "AuthType=ClientSecret;RequireNewInstance=false;Url={CrmDynamicsPrivatePrimaryConnection};ClientId={CrmDynamicsPrivateClientId};ClientSecret={CrmDynamicsPrivateClientSecret};LoginPrompt=Never;"
    

    出现此错误是因为我使用的是过期版本的Microsoft.CrmSdk.XrmTooling.CoreSassembly
    。我使用的是版本
    9.0.2.27
    ,根据一份网络报告,连接ClientSecret需要版本
    9.1.0.13
    。我使用NuGet更新到版本
    9.1.0.68
    ,动态连接工作正常。

    该方法当然有效,谢谢发布。它仍然无法解决SDK中记录的连接字符串方法无法工作的原因。我想弄清楚我是做错了什么,还是一个bug。在我的真实应用程序中,问题变成了我更喜欢从配置文件中获取连接字符串,因为这样就不必知道我正在建立什么类型的连接并传递正确的参数。我在
    连接字符串中有一个类型。应该是authtype,我有authtype。这就是说,你的回答实际上让我明白了这一点,值得称赞-将身份验证类型声明为显式参数有助于消除此问题。很高兴你找到了根本原因:)。。顺便说一句,这是一种很难在一开始就注意到的打字错误。这对我来说是“ServicePointManager.SecurityProtocol=SecurityProtocolType.Tls12;”。谢谢