当我通过 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 的原因吗?