在C#中接受SOAP 1.2的text / xml

时间:2018-12-13 05:34:02

标签: c# soap .net-3.5

我有一个充当SOAP API的.Net 3.5 WCF服务。客户端现在需要发送SOAP 1.2信封(soap:Envelope而不是soapenv:Envelope),但是他们仍然使用text / xml作为请求的内容类型,而不是application / soap + xml

是否可以通过配置调整服务以接受此行为,还是我需要创建类似HttpHandler的内容来拦截请求并修改内容类型?我已经使用了在Dispatcher中注册的自定义消息筛选器来满足对Action的修改,因为提供了我正在读取和路由的自定义标头。

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 个答案:

答案 0 :(得分:0)

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

此方法的窍门是注册一个新的Text Encoding元素,以标识此绑定可以接受的消息类型。

由于<textMessageEncoding />元素只能真正使用SOAP11(text / xml)和SOAP12(application / soap + xml),因此注册可以进一步配置的新自定义元素是执行此操作的最可靠方法

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

一旦实现了此代码,就可以定义一个新的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. 使用新的绑定元素来配置绑定