2017-02-13 4 views
1

Dynamics 365 온라인 조직에 연결하는 데 다음 코드가 있습니다. orgService.Execute(new WhoAmIRequest());에 널 참조 예외가 발생하고 오류 로그가 코드 아래에 있습니다. 나는 다른 콘솔 애플 리케이션을 가진 두 대의 컴퓨터에서 이것을 시도했다. 8.2 및 8.0 SDK DLL을 모두 시도했습니다. 8.x SDK DLL을 사용하여 CrmConnection을 사용하여 이것을 다시 작성하면 모든 것이 잘 작동합니다. 나도 같은 자격 증명을 사용하여 조직에 찾아 볼 수 있습니다 (& 오타가없는 확인하기 위해 붙여 잘라.)CrmServiceClient는 항상 null을 반환합니다. 조직 서비스

연결 문자열 형식이 https://msdn.microsoft.com/en-us/library/mt608573.aspx의 예에서 가져온 것입니다

명명 된 계정 사무실을 사용하여 365

<add name="MyCRMServer" -connectionString="AuthType=Office365;[email protected]; Password=passcode;Url=https://contoso.crm.dynamics.com"/>

기본 코드.

var connectionString = @"Url=https://ORGNAME.crm.dynamics.com; [email protected]; Password=43JF##$j#@Ha; Authype=Office365;"; 

var client = new CrmServiceClient(connectionString);    

var orgService = (IOrganizationService)client.OrganizationWebProxyClient ?? client.OrganizationServiceProxy; 

orgService.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 

답변

2

가 연결 문자열 대신 CrmServiceClient에 직접 매개 변수를 전달하는 시도?

나는이 다음과 같은 방법

public CrmServiceClient(string crmUserId, SecureString crmPassword, string crmRegion, string orgName, bool useUniqueInstance = false, bool useSsl = false, OrganizationDetail orgDetail = null, bool isOffice365 = false); 

를 사용하여 Dynamics365에 성공적으로 연결 그리고 여기에 문자열을

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; 
} 
을 확보하기 위해 암호를 변환하는 방법 나는

var pwd = ConvertToSecureString("userpassword"); 
CrmServiceClient client = new CrmServiceClient("[email protected]", pwd, "NorthAmerica", "orgname", isOffice365: true); 

적용 방법 그리고 여기 있습니다

+0

그 방법은 확실히 작동합니다, 그것을 게시 주셔서 감사합니다. SDK에 문서화되어있는 연결 문자열 메서드가 작동하지 않는 이유는 여전히 해결되지 않습니다. 내가 잘못했는지 또는 버그인지 알아 내려고 노력 중입니다. 문제는 내 실제 응용 프로그램에서 구성 파일에서 연결 문자열을 얻는 것을 선호합니다. 즉, 연결 유형을 알아 내야하고 올바른 매개 변수를 전달하지 않아도됩니다. – Nicknow

+0

나는 그것을 이해했다. 나는'connectionString'에 타입을 가지고 있습니다. 그것은 __authtype__이어야하고 나는 __authype__을 가지고 있어야합니다. 귀하의 대답은 실제로 저를 거기에 데려다주었습니다. 인증 유형을 명시 적 매개 변수로 선언하면이 문제를 해결하는 데 도움이됩니다. – Nicknow

+0

근본 원인을 찾아 냈기 때문에 다행 스럽네요. :) btw는 오타가 처음으로 눈치 채기 어려웠습니다. –