Передача больших файлов с помощью службы WCF - получение ошибки 413 - PullRequest
0 голосов
/ 21 февраля 2020

Я знаю, что эта топика c уже неоднократно обсуждалась, но, к сожалению, ни одно из предложенных решений не сработало для меня. Я пытаюсь перенести большие файлы (до 1,5 ГБ) из клиентского консольного приложения в службу WCF. Но я всегда получаю сообщение об ошибке HTTP Удаленный сервер возвратил неожиданный ответ: (413) запрос слишком большой. при передаче содержимого файла.

Вся информация, найденная в inte rnet где о добавлении maxContentLength и аналогичной конфигурации в файл web.config. Но я предполагаю, что я ввел их в неправильной части из файла web.config или около того.

Редактировать 26.02.2020 18:35 (обновлено из-за подсказок и новых тестов)

На основе подсказок сверху я добавил несколько записей в конфигурационные файлы и сделал еще несколько тестов. Тем временем я обнаружил несколько вещей:

  • Число в web.config определяет размер в битах, а не в байтах, как я читаю на нескольких страницах
  • Число должно быть допустимое значение int32 - поэтому максимальное значение составляет 2147483647
  • 2147483647 бит около 256 МБайт - так что это понятно То, что мой тестовый файл размером около 400 МБ вызвал проблему

В целом, если невозможно передать большие файлы - должно быть по крайней мере 20-30 МБ . Для больших файлов я найду другое решение.

Для более простых тестов я просто создал новую пустую службу WCF и консольное приложение для ее тестирования.

Вы можете найти полный исходный код на Google Диск . Я также включил тестовое изображение 22 МБ, которое не работает для передачи.

В отличие от моей первой проблемы, Теперь я получаю ошибку 404 вместо 413. Так или иначе, IIS возвращает 404, когда запрос не соответствует сервису вместо предыдущего 413. Довольно странное для меня поведение.

web.config и app.config выглядят по-прежнему так же, как и раньше (кроме нет структуры сущностей).

Сервер web.config

<?xml version="1.0"?>
<configuration>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="mybinding"  maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
          <security mode="None"/>
        </binding>
      </basicHttpBinding>
    </bindings>
    <protocolMapping>
      <add binding="basicHttpBinding" scheme="http" bindingConfiguration="mybinding" />
    </protocolMapping>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <directoryBrowse enabled="true"/>
  </system.webServer>
</configuration>

Клиент app.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="mybinding" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" />
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:53042/Service1.svc" binding="basicHttpBinding"
                bindingConfiguration="mybinding" contract="ServiceReference1.IService1"
                name="BasicHttpBinding_IService1" />
        </client>
    </system.serviceModel>
</configuration>

Поскольку я не профессионал в отношении web.config Конфигурация, я полагаю, я просто добавил конфигурацию в неправильный раздел XML. Кто-нибудь может мне помочь, как должен выглядеть мой web.config, чтобы я мог передавать большие файлы.

Заранее спасибо

С уважением, Маркус

1 Ответ

1 голос
/ 25 февраля 2020

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

    <bindings>
      <basicHttpBinding>
        <binding name="mybinding" ... >
        ...
        </binding>
      </basicHttpBinding>
    </bindings>
<protocolMapping>
      <add binding="basicHttpBinding" scheme="http" bindingConfiguration="mybinding"/>
</protocolMapping>

Если она не работает, мы можем опубликовать sh услуга с использованием следующего стиля.

<system.serviceModel>
    <services>
      <service name="WcfService1.Service1">
        <endpoint address="" binding="basicHttpBinding" contract="WcfService1.IService1" bindingConfiguration="mybinding"></endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
      </service>
</services>

Не стесняйтесь сообщить мне, если проблема все еще существует.

...