Dynamics crm CrmServiceClient始终返回空的组织服务
我有以下代码连接到Dynamics 365 Online组织。它在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的命名帐户
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;”。谢谢