(400)错误请求 - 使用transferMode = Streamed调用SOAP服务时

时间:2013-07-23 10:13:34

标签: wcf soap streaming routetable

当我通过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 metod中放置的任何断点。但是,如果我手动创建服务主机,它确实会遇到断点。我注意到Stream.Lenth属性在通过SOAP调用时引发异常,但在通过REST调用时则不会。这可能与问题有关吗?

当有人通过RouteTable发布时调用带有transferMode = Streamed的SOAP服务时,为什么我会得到(400)错误请求?

0 个答案:

没有答案