CrmServiceClient всегда возвращает нулевой сервис организации
У меня есть следующий код для подключения к Dynamics 365 Online организации. Выдает исключение нулевой ссылки на orgService.Execute(new WhoAmIRequest());
и журнал ошибок находится ниже кода. Я пробовал это на двух машинах с различными консольными приложениями. Я пробовал обе библиотеки DLL SDK 8.2 и 8.0. Если я переписать это с помощью CrmConnection
с 7.x SDK DLL все работает отлично. Я могу просматривать организации, используя те же учетные данные (вырезать и вставить, чтобы убедиться, что нет опечатки.)
Формат строки подключения взят из примера по адресу https://msdn.microsoft.com/en-us/library/mt608573.aspx:
Именованная учетная запись с использованием Office 365
<add name="MyCRMServer" -connectionString="AuthType=Office365;Username=jsmith@contoso.onmicrosoft.com; Password=passcode;Url=https://contoso.crm.dynamics.com"/>
Основной код.
var connectionString = @"Url=https://ORGNAME.crm.dynamics.com; Username=username@ORGNAME.onmicrosoft.com; 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
4 ответа
Вы пытались передать параметры непосредственно в 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;
}
Согласно последней рекомендации Microsoft мы не должны использовать "AuthType=Office365".
Мы можем использовать учетную запись приложения (идентификатор клиента и секретный ключ) для создания токена и доступа к сервису организации Dynamics CRM. Но если вы хотите использовать User ID и PWD, используйте (AuthType = OAuth)
Образец кода:
string connectionString = "AuthType = OAuth; Url = 'https: //*****.crm.dynamics.com'; Username = ''; Password = ''; AppId = 51f81489-12ee-4a9e-aaae-a2591f45987d; RedirectUri = app: // 58145B91-0C36-4500-8554-080854F2AC97;LoginPrompt=Never ";
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
CrmServiceClient crmServiceClient = новый CrmServiceClient(connectionString); WhoAmIResponse whoAmIResponse = crmServiceClient.Execute(новый WhoAmIRequest()) как WhoAmIResponse;
Примечание. При попытке использовать это из функции Azure я получил следующие ошибки:
- ЗАПРОС ОШИБКИ токен из контекста аутентификации Требуются непустые полномочия
- Произошла одна или несколько ошибок. => Произошла ошибка при отправке запроса. => Базовое соединение было закрыто: при отправке произошла непредвиденная ошибка. => Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом. => Существующее соединение было принудительно закрыто удаленным хостом. ERROR REQUESTING Token из контекста аутентификации
- CurrentAccessToken = 'crmServiceClient.CurrentAccessToken' вызвал исключение типа 'System.NullReferenceException'
Их легко решить, используя всего одну дополнительную строку: ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Ссылка URL: https://support.microsoft.com/en-us/help/4051700
Microsoft Dynamics 365 Customer Engagement (Online), чтобы потребовать TLS 1.2 для подключения
Пожалуйста, дайте мне знать, если у вас возникнут другие проблемы.
Спасибо, Сумит
я получал ошибку
Unable to login to Dynamics CRM, Error was :
Data[0] = "The provided uri did not return any Service Endpoints!
Я получил эту ошибку при попытке подключения к Dynamics с помощью строки подключения с AuthType=ClientSecret. Раньше я успешно подключался, используя имя пользователя и пароль со строкой подключения формы
"Url={dynamicsConnectionString};Username={username};Password={password};AuthType=Office365;"
Строка подключения была изменена, чтобы иметь вид
"AuthType=ClientSecret;RequireNewInstance=false;Url={CrmDynamicsPrivatePrimaryConnection};ClientId={CrmDynamicsPrivateClientId};ClientSecret={CrmDynamicsPrivateClientSecret};LoginPrompt=Never;"
Ошибка возникла из-за того, что я использовал устаревшую версию
Microsoft.CrmSdk.XrmTooling.CoreAssembly
. Я использовал версию
9.0.2.27
, и, согласно веб-отчету, версия
9.1.0.13
необходим для подключения к ClientSecret. я обновился до версии
9.1.0.68
с помощью NuGet, и соединение Dynamics сработало.
Я изо всех сил пытался решить эту проблему, потому что все, что я делал, кроме установки более высокой версии (в документах MS они также не упоминали об этом) Microsoft.CrmSdk.XrmTooling.CoreAssembly , поскольку более низкая версия этой dll не поддерживает аутентификацию ClientSecret .