0

当我通过 SOAP 调用 WCF 服务时,我收到 (400) Bad Request 返回,其中该方法采用 Stream 类型的单个参数和 transferMode=Streamed。

仅当我使用 RouteTable 类发布服务时才会出现此异常:

RouteTable.Routes.Add(new ServiceRoute("ping", new ServiceHostFactory(), typeof(PingService)));

如果我自己创建一个 ServiceHost,那么我可以毫无问题地调用该服务:

host = new ServiceHost(typeof(PingService));
host.Open();

以下是服务合同的示例:

[ServiceContract]
public interface IPing
{
   [OperationContract]
   Stream Ping(Stream stream);
}

这是Web.config:

<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
    </system.web>
  <system.serviceModel>

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>

    <services>
      <service name="SoapStreamedWebServiceTest.PingService" behaviorConfiguration="md">
        <endpoint address="" binding="basicHttpBinding" contract="SoapStreamedWebServiceTest.IPing"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="md">
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

    <bindings>
      <basicHttpBinding>
        <binding name="stm" transferMode="Streamed"/>
      </basicHttpBinding>
    </bindings>

  </system.serviceModel>
</configuration>

如果我使用 ServiceHostFactory 和 basicHttpBinding 创建 SOAP 服务,这只是一个问题。如果我使用 WebServiceFactory 和 webHttpBinding 创建一个 REST 服务,那么它工作正常。但是,我需要为同一服务发布 REST 和 SOAP 端点。

如果 transferMode 是 Streamed 或 StreamedRequest,这也是一个问题,它适用于 Buffered 和 StreamedResponse。但是,我需要允许消费者以流式方式向我传递数据。

如果服务是使用 RouteTable 发布的,那么当使用 transferMode=Streamed 调用时,它将返回 (400) Bad Request,而不会遇到我在 Ping 方法中放置的任何断点。但是,如果我手动创建一个服务主机,它确实会遇到断点。我注意到 Stream.Lenth 属性在通过 SOAP 调用时会引发异常,但在通过 REST 调用时不会。这可能与问题有关吗?

任何人都可以解释为什么在通过 RouteTable 发布调用带有 transferMode=Streamed 的 SOAP 服务时我得到 (400) Bad Request 的原因吗?

4

0 回答 0