Вопрос:

Потоковое WCF работает при отладке, но не при развертывании

c# wcf iis

253 просмотра

1 ответ

482 Репутация автора

У меня есть приложение, которое отправляет большой объем данных в веб-службу WCF. Поскольку данные могут быть большими, я хотел использовать Streamed TransportMode, чтобы я мог обрабатывать данные по мере их поступления, а не буферизовывать их все.

Когда я отлаживаю приложение, потоковая передача работает как положено. Как только я действительно публикую сервис на моем сервере IIS, потоковая передача больше не работает и данные, похоже, просто буферизируются.

Я проверил это, поставив throw new Exceptionв начале функцию веб-службы и изменив исходный поток, чтобы предоставить «бесконечные данные».

Вот исходный код сервера:

[ServiceContract]
public class Service1
{
    [OperationContract]
    public void SubmitData(Stream stream)
    {
        throw new Exception("Test");
        using (var reader = new StreamReader(stream))
        {
            string line = reader.ReadLine();
            // Do Something...
        }
    }
}

Вот код клиента:

Service1Client client = new Service1Client();
client.Endpoint.Address = new EndpointAddress(address);
client.Open();
using (var stream = new InfiniteDataStream())
    client.SubmitData(stream);
client.Close();  

,

class InifiteDataStream : Stream
{
    ...

    public override int Read(byte[] buffer, offset, count)
    {
        // Create random data...
        return count;
    }

    ...
}

Сервер Web.Config:

  <system.serviceModel>
    <bindings>
      <basicHttpsBinding>
        <binding transferMode="Streamed" maxReceivedMessageSize="2147483647">
          <security mode="TransportWithMessageCredential">
            <message clientCredentialType="UserName" />
          </security>
      </basicHttpsBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <protocolMapping>
      <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>
  </system.serviceModel>

Клиентское приложение.Конфигурация:

<system.serviceModel>
<bindings>
  <basicHttpsBinding>
    <binding name="BasicHttpsBinding_Service1" transferMode="Streamed" >
      <security mode="TransportWithMessageCredential" />
    </binding>
  </basicHttpsBinding>
</bindings>
<client>
  <endpoint address="https://localhost:56297/WebService/Service1.svc"
    binding="basicHttpsBinding" bindingConfiguration="BasicHttpsBinding_Service1"
    contract="WebService.Service1" name="BasicHttpsBinding_Service1" />
</client>

Как я уже говорил, этот код работает точно так же, как и при отладке Im в VS (с IIS Express), когда я запускаю клиент, он немедленно выдает исключение. Когда я запускаю клиент, указывающий на веб-сервер, он просто сидит там, пока не получит исключение тайм-аута при получении. Что и следовало ожидать от буферизованного транспорта, поскольку он никогда не будет выполняться буферизацией. И если я отлаживаю клиентское приложение, когда оно направлено на веб-сервер, я вижу, что в потоке вызывается функция Read.

Есть ли какая-то конфигурация в IIS, которую нужно изменить? Я просмотрел настройки и не увидел ничего очевидного.

Обновление: я нашел это сообщение на форуме форумов Microsoft https://social.msdn.microsoft.com/Forums/vstudio/en-US/cfe625b2-1890-471b-a4bd-94373daedd39/streamedrequest-possible-under-iis?forum=wcf
Последний комментарий указывает, что это была ошибка, которая была исправлена ​​в .Net 4.5, но я собираюсь с 4.6.1

Кроме того, мой сервер работает под управлением IIS 8.5, поэтому я решил попробовать тот же тест на моей локальной машине Win10, на которой установлен IIS 10, но при этом все так же.

Используя Wireshark, я смог подтвердить, что данные передаются на сервер, а сервер их не обрабатывает. Я также попытался изменить transferMode="Streamed"к transferMode="StreamedRequest", не повезло.

Автор: Brian Tacker Источник Размещён: 05.04.2017 08:16

Ответы (1)


1 плюс

1513 Репутация автора

Решение

Замена throw new Exceptionстроки кода записью в файл журнала показала, что в коде нет ничего неправильного, и потоковая передача запроса от клиента к серверу работает должным образом для экземпляра службы, размещенного в локально работающем IIS.

Автор: Eugene Komisarenko Размещён: 12.04.2017 06:02
Вопросы из категории :
32x32