(400) Неверный запрос - при вызове службы SOAP с помощью TransferMode=Streamed
Я получаю (400) неверный запрос, возвращаемый, когда я вызываю службу WCF через SOAP, где метод принимает один параметр типа 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>
Это только проблема, если я создаю сервис SOAP с использованием ServiceHostFactory и basicHttpBinding. Если я создаю REST-сервис, используя WebServiceFactory и webHttpBinding, то он работает нормально. Однако мне нужно опубликовать конечную точку REST и SOAP для одной и той же службы.
Это также является проблемой только в том случае, если для TransferMode задано значение Streamed или StreamedRequest, оно работает для Buffered и StreamedResponse. Однако мне нужно разрешить потребителю передавать мне данные в потоковом режиме.
Если служба публикуется с использованием RouteTable, она возвращает (400) неверный запрос при вызове с помощью TransferMode=Streamed, не затрагивая ни одну точку останова, которую я помещаю в метод Ping. Однако, если я вручную создаю узел службы, он достигает точки останова. Я заметил, что свойство Stream.Lenth вызывает исключение при вызове через SOAP, но не при вызове через REST. Может ли это быть как-то связано с проблемой?
Кто-нибудь может пролить свет на то, почему я получаю (400) неверный запрос при вызове службы SOAP с помощью TransferMode=Streamed, когда он публикуется через RouteTable?