Как настроить веб-страницу ASP.NET для использования wsHttpBinding при запросе CRM Online?

Как настроить веб-форму ASP.NET для отправки запросов через wsHttpBinding скорее, чем basicHttpBinding когда запрашиваете CRM Online?

В качестве предыстории это довольно простая страница ASPX, размещенная локально в IIS 8.5.
Страница предназначена для подключения к CRM Online и получения некоторых данных.
Изменить. Это приложение проходит проверку подлинности через Azure AD, поэтому оно использует идентификатор клиента и ключ. Я хочу уклоняться от использования строк подключения и учетных данных домена, если это не является неизбежным.

Я думаю, что у меня правильная аутентификация в CRM, но когда я запускаю запрос, я получаю сообщение об ошибке ниже:

System.Net.WebException: удаленный сервер возвратил ошибку: (415) Невозможно обработать сообщение, поскольку тип содержимого 'text/xml; charset=utf-8'не был ожидаемым типом'application/soap+xml; кодировка = UTF-8'..

Я думаю, что это потому, что я не указал привязку в web.config так что моя страница отправляет все через basicHttpBinding и интерфейс CRM Online ожидает wsHttpBinding,

Я попытался использовать пример в нижней части этой статьи MSDN (и его варианты), но это не имеет значения.

Вот код для подключения к CRM в случае, если это имеет значение. Очевидно, я скрыл реальные детали конфигурации.

// CONFIGURE OAUTH
var tenantName = "mycompany.onmicrosoft.com";
var authString = string.Format(@"https://login.microsoftonline.com/{0}",tenantName);
var authContext = new AuthenticationContext(authString, false);
var clientId = "123ab123-123a-1a23-abcd-1a2345612345";
var key = "nStgfrdk0oyaC1P5+/FQ4wGn4fRgUTr8HTKejytf0bv=";
var clientCred = new ClientCredential(clientId, key);
var resource = "https://myinstance.crm4.dynamics.com";

// ACQUIRE THE AUTH TOKEN
var authResult = await authContext.AcquireTokenAsync(resource, clientCred);

// CREATE THE CONNECTION TO CRM
var orgService = new OrganizationWebProxyClient(
    new Uri("https://dev.crm4.dynamics.com/XRMServices/2011/Discovery.svc"), true)
    {
        HeaderToken = authResult.AccessToken,
        SdkClientVersion = "8.1.0"
    };

// RUNNING THIS QUERY CAUSES THE ERROR
var contacts = orgService.RetrieveMultiple(new QueryExpression
{
    EntityName = "contact",
    ColumnSet = new ColumnSet("firstname", "lastname")
})
.Entities
.Select(item => item.ToEntity<Contact>());

Вот трассировка стека в случае его использования:

[WebException: удаленный сервер возвратил ошибку: (415) Невозможно обработать сообщение, потому что тип содержимого 'text/xml; charset=utf-8'не был ожидаемым типом'application/soap+xml; charset = utf-8 '..] System.Net.HttpWebRequest.GetResponse () +1740 System.ServiceModel.Channels.HttpChannelRequest.WaitForReply (TimeSpan timeout) +75

[ProtocolException: Тип содержимого text / xml; charset = utf-8 не поддерживается службой https://dev.crm4.dynamics.com/XRMServices/2011/Discovery.svc. Привязки клиента и службы могут не соответствовать друг другу.] System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) +14350190 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msg) Microsoft.Xrm.Sdk.IOrganizationService.RetrieveMultiple(запрос QueryBase) +0 Microsoft.Xrm.Sdk.WebServiceClient.WebProxyClient 1.ExecuteAction(Func 1 действие) +51 Quote_Robot_Demo.d__4.MoveNext() +887 System.Runtime.CompilerServices.<> C.b__6_0(состояние объекта) +56 System.Web.Util.SynchronizationHelper.SafeWrapCallback(действие действия) +110 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(задача-задача) +13847892 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача-задача) +61 System.Web.Util.WithinCancellableCallbackTex.We.We.We. +7970

Изменить: Как только я добавил ссылку на сервис, я получил это в моем web.config:

  <system.serviceModel>
<bindings>
  <customBinding>
    <binding name="CustomBinding_IDiscoveryService">
      <textMessageEncoding />
      <httpsTransport />
    </binding>
  </customBinding>
</bindings>
<client>
  <endpoint address="https://dev.crm4.dynamics.com/XRMServices/2011/Discovery.svc"
    binding="customBinding" bindingConfiguration="CustomBinding_IDiscoveryService"
    contract="CRMService.IDiscoveryService" name="CustomBinding_IDiscoveryService" />
</client>
</system.serviceModel>

1 ответ

Решение

Хотя теперь у меня есть некоторые другие проблемы, я обнаружил, как изменить привязку.
Вы можете добавить сервис организации как ссылку на сервис к вашему проекту, как я сделал, а затем назначить привязку следующим образом:

orgService.Endpoint.Binding = new CustomBinding("CustomBinding_IOrganizationService");

Строка, переданная пользовательской привязке, является просто именем, взятым из конфигурации:

<system.serviceModel>
  <bindings>
    <customBinding>
      <binding name="CustomBinding_IOrganizationService">
        ....

Изменить: позже я обнаружил, что изменение привязки не было необходимости. Похоже, ошибка вызвана неверным токеном безопасности. Я изменил способ создания токенов безопасности, чтобы использовать grant_type из password и ошибка ушла сама по себе.

Другие вопросы по тегам