Неверный ответ (400) с потоковой службой WCF, настроенной программно - PullRequest
4 голосов
/ 25 августа 2009

это если моя первая попытка использовать потоковую передачу для WCF, и я борюсь с ужасным ответом «Удаленный сервер возвратил неожиданный ответ: (400) Bad Request».

Средство просмотра трассировки говорит, что это исключение System.ServiceModel.ProtocolException с сообщением « Проблема с XML, полученным из сети. Дополнительные сведения см. Во внутреннем исключении ». Внутренний тип исключения говорит: " Тело сообщения не может быть прочитано, потому что оно пустое. "

Оставляя все остальное равным, если я переключаюсь в буферизованный режим на стороне клиента, я могу отладить код сервера!

По какой-то причине я должен настроить свою службу программно следующим образом:

    public IUniverseFileService OpenProxy(string serviceUrl)
    {
        Debug.Assert(!string.IsNullOrEmpty(serviceUrl));

        var binding = new BasicHttpBinding();
        binding.Name = "basicHttpStream";
        binding.MaxReceivedMessageSize = 1000000;
        binding.TransferMode = TransferMode.Streamed;

        var channelFactory = 
           new ChannelFactory<localhost.IUniverseFileService>(
              binding, 
              new EndpointAddress(serviceUrl));

        return channelFactory.CreateChannel();
    }

Пока сервер настроен следующим образом:

 <system.serviceModel>
    <!-- BEHAVIORS -->
    <behaviors>
      <serviceBehaviors>
        <behavior name="serviceBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true" httpHelpPageEnabled="true"/>
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <!-- SERVICES -->
    <services>
      <service behaviorConfiguration="serviceBehavior" name="Org.Acme.UniverseFileService">
        <endpoint address="" 
                  binding="basicHttpBinding" 
                  name="basicHttpStream" 
                  bindingConfiguration="httpLargeMessageStream"
                  contract="Org.Acme.RemoteCommand.Service.IUniverseFileService" /> 
        <endpoint address="mex" 
                  binding="mexHttpBinding" 
                  bindingConfiguration="" name="mexStream" 
                  contract="IMetadataExchange"/>
      </service>
    </services>
    <!-- BINDINGS -->
    <bindings>
      <basicHttpBinding>
        <binding name="httpLargeMessageStream" 
                 maxReceivedMessageSize="2147483647" 
                 maxBufferPoolSize="2147483647"
                 maxBufferSize="2147483647" 
                 transferMode="Streamed"/>
      </basicHttpBinding>
    </bindings>

Я ценю вашу помощь!

Stefano

Ответы [ 3 ]

7 голосов
/ 25 августа 2009

Все начало работать, когда я изменил режим передачи с Streamed на StreamedResponse следующим образом:

binding.TransferMode = TransferMode.StreamedResponse;

Тем не менее, я не понимаю, почему это работает, а Streamed нет, и почему я могу отправлять и получать поток файлов с сервера.

5 голосов
/ 14 июня 2012

Режим потоковой передачи не поддерживается сервером разработки ASP.NET. Чтобы использовать потоковый режим, необходимо развернуть службу в IIS (или приложении службы WCF).

1 голос
/ 05 декабря 2010

Попробуйте добавить messageEncoding = "Mtom" в теге bining.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...