(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?

0 ответов

Другие вопросы по тегам