当我通过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)错误请求?