如何将ASP.NET网页配置为在查询CRM Online时使用wsHttpBinding

本文关键字:Online CRM 查询 wsHttpBinding ASP NET 配置 网页 | 更新日期: 2023-09-27 17:58:25

在查询CRM Online时,如何将ASP.NET web表单配置为通过wsHttpBinding而不是basicHttpBinding发送请求?

作为背景,这是一个非常基本的ASPX页面,在IIS 8.5中本地托管。
该页面旨在连接到CRM Online并提取一些数据
编辑:此应用程序通过Azure AD进行身份验证,这就是它使用客户端ID和密钥的原因。我想避免使用连接字符串和域凭据,除非这是不可避免的

我认为我已经正确地验证了CRM,但当我运行查询时,我收到以下错误:

System.Net.WebException:远程服务器返回错误:(415)由于内容类型为"text/xml;charset=utf-8不是预期的类型"application/soap+xml;charset=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()+1740System.ServiceModel.Channels.HttpChannelRequest.WWaitForReply(TimeSpan超时)+75

[ProtocolException:内容类型text/xml;服务不支持charset=utf-8https://dev.crm4.dynamics.com/XRMServices/2011/Discovery.svc.客户端和服务绑定可能不匹配。]System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage-reqMsg,IMessage-retMsg)+1430190System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&msgData,Int32类型)+388Microsoft.Xrm.Sdk.IOrganizationService.RestiveMultiple(QueryBase查询)+0Microsoft.Xrm.Sdk.WebProxyClient 1.ExecuteAction(Func 1操作)+51报价_Robot_Demo.d_4.MoveNext()+887System.Runtime.CompilerServices。<>c.b__6_0(对象状态)+56System.Web.Util.SynchronizationHelper.SafeWrapCallback(动作)+110System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)+1384792System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)+61System.Web.Util.WithinCancelableCallbackTaskAwaiter.GetResult()+32System.Web.UI.d_523.MoveNext()+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>

如何将ASP.NET网页配置为在查询CRM Online时使用wsHttpBinding

虽然我现在有一些其他问题,但我确实发现了如何更改绑定
你可以像我一样将组织服务作为服务引用添加到你的项目中,然后像这样分配绑定:

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

传递给自定义绑定的字符串只是取自config:的名称

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

编辑:后来我发现没有必要更改绑定。错误似乎是由无效的安全令牌引起的。我更改了生成安全令牌的方式,使用passwordgrant_type,错误自行消失。