为了账号安全,请及时绑定邮箱和手机立即绑定

在 C# 中接受 SOAP 1.2 的文本/xml

在 C# 中接受 SOAP 1.2 的文本/xml

C#
守着一只汪 2022-06-12 14:46:09
我有一个用作 SOAP API 的 .Net 3.5 WCF 服务。客户端现在需要发送 SOAP 1.2 信封(soap:Envelope 而不是 soapenv:Envelope),但他们仍然使用 text/xml 作为请求的内容类型,而不是 application/soap+xml是否可以通过配置调整服务以接受此行为,或者我需要创建类似 HttpHandler 的东西来拦截请求并修改内容类型?我已经在使用在 Dispatcher 中注册的自定义消息过滤器来满足对操作的修改,因为提供了我正在阅读和路由的自定义标头。Web 服务的当前配置如下所示:<services>  <service behaviorConfiguration="Service1Behavior"    name="BusinessService">    <endpoint address="" binding="basicHttpBinding" bindingConfiguration="myBindingForBigArrays"      contract="IMasterService">      <identity>        <dns value="localhost" />      </identity>    </endpoint>    <endpoint address="/12" binding="customBinding" bindingConfiguration="https12Binding"      contract="IMasterService" behaviorConfiguration="crsBehavior">    </endpoint>    <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />  </service>绑定配置是      <customBinding>    <binding name="https12Binding">      <transactionFlow />      <textMessageEncoding messageVersion="Soap12">        <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647"            maxBytesPerRead="2147483647"            maxNameTableCharCount="2147483647" />      </textMessageEncoding>      <httpsTransport maxReceivedMessageSize="2147483647"  />    </binding>  </customBinding>  <basicHttpBinding>    <binding name="myBindingForBigArrays" maxReceivedMessageSize="2147483647">      <security mode="Transport">        <transport clientCredentialType="None"/>      </security>      <readerQuotas maxDepth="64" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384" />    </binding>  </basicHttpBinding>
查看完整描述

1 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

我已经解决了我的问题,我将更新此问题以供将来参考以及可能遇到此问题的任何其他人参考。

这样做的诀窍是注册一个新的文本编码元素来识别此绑定可以接受的消息类型。

由于该<textMessageEncoding />元素实际上只能采用 SOAP11 (text/xml) 和 SOAP12 (application/soap+xml),因此注册一个可以进一步配置的新自定义元素是最可靠的方法。

Microsoft 有一些示例代码来执行此操作,可以轻松地将其导入到解决方案中(我创建了一个单独的库来容纳此代码以供参考)。此参考数据可在此处找到示例代码可在此处找到

实现此代码后,您可以定义一个新的 textMessageEncoding 元素 customTextMessageEncoding 组合,例如<customTextMessageEncoding encoding="utf-8" mediaType="text/xml" messageVersion="Soap12" />. 请注意,参考链接错误地将上面的行标记为contentType而不是mediaType。上面的组合允许我使用 SOAP 1.2 信封和 SOAP 1.1 内容类型注册绑定。

另一件事是使用 mediaType 来更改响应类型,并覆盖 MessageEncoder 上的 IsContentTypeSupported 以允许服务响应不同的内容类型。这也是客户的要求,尽管它很不寻常。该服务现在可以接受 text/xml 和 application/soap+xml(通过覆盖的方法)并响应提供的 mediaType

简而言之,解决方案需要:

  1. 实现自定义编码器和编码器工厂

  2. 为自定义编码器实现绑定元素

  3. 使用自定义绑定配置集成自定义绑定元素

  4. 开发自定义配置处理程序以允许自定义绑定元素的文件配置(app.config 或 web.config)

  5. 在 web.config 中注册新的绑定元素

  6. 使用新的绑定元素来配置绑定


查看完整回答
反对 回复 2022-06-12
  • 1 回答
  • 0 关注
  • 324 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信