【问题标题】:Accepting text/xml for SOAP 1.2 in C#在 C# 中接受 SOAP 1.2 的文本/xml
【发布时间】:2018-12-13 05:34:01
【问题描述】:

我有一个用作 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>

【问题讨论】:

    标签: c# soap .net-3.5


    【解决方案1】:

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

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

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

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

    实现此代码后,您可以定义一个新的 textMessageEncoding 元素 customTextMessageEncoding 组合,例如&lt;customTextMessageEncoding encoding="utf-8" mediaType="text/xml" messageVersion="Soap12" /&gt;。请注意,参考链接错误地将上面的行标记为 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. 使用新的绑定元素配置绑定

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-20
      • 2021-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-26
      • 1970-01-01
      相关资源
      最近更新 更多