Потоковая передача большого файла WCF

Я прочитал эту статью http://www.codeproject.com/Articles/166763/WCF-Streaming-Upload-Download-Files-Over-HTTP для загрузки большого файла через WCF.

Я создал ту же конфигурацию, но я только что загрузил файл 48kb, даже если я добавил атрибут maxReceivedMessageSize ="2147483647". Когда я пытаюсь загрузить файл размером более 48кб, я получаю сообщение об ошибке

Удаленный сервер возвратил ошибку: (413) Request Entity Too Large.

Я ошибся или что-то пропустил? Ниже мой конфиг

Конфигурация сервера:

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime executionTimeout="4800" maxRequestLength="2097150"/>
  </system.web>
  <system.serviceModel>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    <!--BINDING-->
    <bindings>
      <basicHttpBinding>
        <binding name="TransferService" 
                 closeTimeout="00:10:00"
                 maxBufferPoolSize="2147483647"
                 maxBufferSize="2147483647"
                 maxReceivedMessageSize ="2147483647" 
                 openTimeout="00:10:00" 
                 receiveTimeout="00:10:00" 
                 sendTimeout="00:10:00" 
                 messageEncoding="Text"
                 transferMode="Streamed"
                 >
          <readerQuotas
            maxDepth="2147483647" 
            maxStringContentLength="2147483647"
            maxBytesPerRead="2147483647" 
            maxNameTableCharCount="2147483647" 
            maxArrayLength="2147483647"/>
        </binding>
        </basicHttpBinding>
    </bindings>

    <!--SERVICE-->
    <services>
      <service name="TransferService.TransferService" 
               behaviorConfiguration="TransferServiceBehavior" >
         <endpoint  
             address="" 
             binding="basicHttpBinding" 
             bindingConfiguration="TransferService" 
             contract="TransferService.ITransferService" >
        </endpoint>
      </service>
    </services>

    <!--BEHAVIOR-->
    <behaviors>
      <serviceBehaviors>
        <behavior name="TransferServiceBehavior">
          <serviceMetadata httpGetEnabled="true"  />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <dataContractSerializer maxItemsInObjectGraph="2147483647" />
          <serviceThrottling maxConcurrentCalls="500" maxConcurrentSessions="500" maxConcurrentInstances="500" />
        </behavior>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
 <system.webServer>
   <security>
     <requestFiltering>
       <requestLimits maxAllowedContentLength="500000000"></requestLimits>
     </requestFiltering>
   </security>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>

Конфигурация веб-клиента:

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_ITransferService" />
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint name="BasicHttpBinding_ITransferService" 
          address="http://localhost/transfer/TransferService.svc"
          binding="basicHttpBinding" 
          bindingConfiguration="BasicHttpBinding_ITransferService"
          contract="TransferService.ITransferService" />
    </client>
  </system.serviceModel>

Пожалуйста, предложите любые решения.

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


Теперь я изменил конфигурацию, как вы предлагаете, но она по-прежнему вызывает ту же ошибку 400 или 413. Ниже мой тестовый проект. Я не знаю почему? (Среда: Window 7 Pro, 64-разрядная версия, IIS7, WCF 4.0)

https://skydrive.live.com/redir?resid=BFE92959302FBAA0!105&authkey=!ANO_URChpql9gKE

Я потратил две недели на исследования, но это та же ошибка.

Пожалуйста помогите. Заранее спасибо.


person nvtthang    schedule 02.11.2012    source источник
comment
Вы должны использовать другой протокол, например NetTCp ... Не используйте basicHTTP для отправки файла   -  person Đức Bùi    schedule 02.11.2012


Ответы (3)


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

Поэтому измените конфигурацию на стороне клиента на:

<system.serviceModel>
   <bindings>
      <basicHttpBinding>
        <binding name="TransferService" 
                 closeTimeout="00:10:00"
                 maxBufferPoolSize="2147483647"
                 maxBufferSize="2147483647"
                 maxReceivedMessageSize ="2147483647" 
                 openTimeout="00:10:00" 
                 receiveTimeout="00:10:00" 
                 sendTimeout="00:10:00" 
                 messageEncoding="Text"
                 transferMode="Streamed"
                 >
          <readerQuotas
            maxDepth="2147483647" 
            maxStringContentLength="2147483647"
            maxBytesPerRead="2147483647" 
            maxNameTableCharCount="2147483647" 
            maxArrayLength="2147483647"/>
        </binding>
        </basicHttpBinding>
    </bindings>

    <client>
      <endpoint name="BasicHttpBinding_ITransferService" 
          address="http://localhost/transfer/TransferService.svc"
          binding="basicHttpBinding" 
          bindingConfiguration="TransferService"
          contract="TransferService.ITransferService" />
    </client>
  </system.serviceModel>

и тогда вы должны иметь одинаковые настройки на клиенте и сервере, и тогда эти настройки станут полезными!

person marc_s    schedule 02.11.2012
comment
Я скопировал ту же конфигурацию, а затем добавил в конфигурацию моего веб-клиента. Но я вызываю ошибку. Удаленный сервер возвратил ошибку: (400) Bad Request. - person nvtthang; 02.11.2012

Я проверил ваш проект, заменил ваш webconfig этим и обновил ссылку на сервис, попробуйте еще раз,

  <?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime executionTimeout="4800" maxRequestLength="2097150"/>
  </system.web>
  <system.serviceModel>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    <!--BINDDING-->
    <bindings>
      <basicHttpBinding>
      </basicHttpBinding>
      <customBinding>
        <binding name="LargeSilverlight" closeTimeout="00:21:00" openTimeout="00:20:00"
          receiveTimeout="00:20:00" sendTimeout="00:50:00">
          <textMessageEncoding maxReadPoolSize="2147483647" maxWritePoolSize="2147483647">
            <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
              maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
          </textMessageEncoding>
          <httpTransport maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
            maxBufferSize="2147483647" />
        </binding>
      </customBinding>
    </bindings>
    <client>
    </client>
    <!--SERVICE-->
    <services>
      <service name="TransferService.TransferService"  behaviorConfiguration="SilverlightWCFLargeDataApplication" >
        <endpoint  address="" binding="customBinding" bindingConfiguration="LargeSilverlight" behaviorConfiguration="SilverlightWCFLargeDataApplication" contract="TransferService.ITransferService" >
        </endpoint>

      </service>
    </services>

    <!--BEHAVIOR-->
    <behaviors>
      <serviceBehaviors>
        <behavior name="SilverlightWCFLargeDataApplication">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>

      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="SilverlightWCFLargeDataApplication">
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
      </endpointBehaviors>
    </behaviors>


  </system.serviceModel>
  <system.webServer>

    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="500000000"></requestLimits>
      </requestFiltering>
    </security>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>
person Sajeetharan    schedule 05.11.2012

Я столкнулся с той же проблемой. и я использую этот код в файле конфигурации, тогда я могу загрузить файл размером 25 МБ, попробуйте это

<system.serviceModel>
      <bindings>
           <basicHttpBinding>
               <binding name="webserviceMOSSuiteSoap" 
              closeTimeout="00:01:00" 
              maxBufferPoolSize="20000000" 
              maxBufferSize="20000000" 
              maxReceivedMessageSize="20000000" 
              openTimeout="00:01:00" 
              receiveTimeout="00:10:00" 
              sendTimeout="00:01:00" 
              messageEncoding="Text" 
              transferMode="Buffered" 
              allowCookies="false" 
              bypassProxyOnLocal="false" 
              hostNameComparisonMode="StrongWildcard"                        
              textEncoding="utf-8"                       
              useDefaultWebProxy="true">
              <readerQuotas maxDepth="32" 
                            maxStringContentLength="20000000" 
                            maxArrayLength="20000000" 
                            maxBytesPerRead="20000000" 
                            maxNameTableCharCount="20000000"/>
              <security mode="None">
              <transport clientCredentialType="None" 
                    proxyCredentialType="None" 
                    realm=""/>
            <message clientCredentialType="UserName" 
                 algorithmSuite="Default"/>
                          </security> 
                    </binding>
            </basicHttpBinding>   
      </bindings>
<client>      
        <endpoint address="http://localhost/WebServiceConnect/webservice.asmx" 
                  binding="basicHttpBinding" 
                  bindingConfiguration="webserviceMOSSuiteSoap" 
                  contract="ServiceReference1.webserviceMOSSuiteSoap" 
                  name="webserviceMOSSuiteSoap"/>
    </client>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" 
                               multipleSiteBindingsEnabled="true"/>
</system.serviceModel>
person Shiraj Momin    schedule 03.11.2012