2015-06-22 2 views
2

Может кто-нибудь, пожалуйста, взгляните на мой новый код? Теперь я застрял на этой ошибки в течение 3 дней, и это сводит меня с ума ...WCF - Загрузка больших файлов - (413) Request Entity Too Large

Я пытаюсь иметь загрузку WCF файлов, но большие файлы не загружены

я получаю эту ошибку : «Удаленный сервер вернул неожиданный ответ: (413)« Запросить сущность слишком большой ».

Мой проект построен из 3-х частей:

  1. WCF сервис

  2. пользовательский элемент управления, который использует службу

  3. веб-сайт, который использует пользовательский элемент управления

Это мой сервис we.config:

<system.serviceModel> 

    <services> 
     <service name="AttachmentService" behaviorConfiguration=""> 
     <endpoint name="DefaultEndPoint" address="http://localhost:54893/AttachmentService.svc" 
        behaviorConfiguration="EndpointBehaviors" 
        binding="wsHttpBinding" bindingName="AttachmentBinding" 
        contract="AttachmentsService.IAttachmentService"></endpoint> 
     </service> 
    </services> 

    <behaviors> 
     <serviceBehaviors> 
     <behavior name=""> 
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
      <dataContractSerializer maxItemsInObjectGraph="2147483647" /> 
     </behavior> 
     </serviceBehaviors> 

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

    <bindings> 
     <basicHttpBinding> 
     <binding name="AttachmentBinding" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" receiveTimeout="00:01:00" sendTimeout="00:01:00" 
       textEncoding="utf-8" openTimeout="00:01:00"> 
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/> 
      <security mode="None" /> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> 
    </system.serviceModel> 

Вот мой пользовательский элемент управления app.config:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="BasicHttpBinding_IAttachmentService" maxBufferSize="2147483647" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647"> 
      <readerQuotas maxDepth="128" maxStringContentLength="2147483647" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:54893/AttachmentService.svc" 
      binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IAttachmentService" 
      contract="AttachmentsService.IAttachmentService" name="BasicHttpBinding_IAttachmentService" /> 
    </client> 
    </system.serviceModel> 
</configuration> 

Вот мой UI web.config:

<system.webServer> 
    <security> 
     <requestFiltering> 
     <requestLimits maxAllowedContentLength="2147483647" /> 
     </requestFiltering> 
    </security> 
    <serverRuntime enabled="true" uploadReadAheadSize="2147483647" maxRequestEntityAllowed="2147483647" /> 
    </system.webServer> 

    <system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="BasicHttpBinding_IAttachmentService" maxBufferSize="2147483647" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647"> 
      <readerQuotas maxDepth="128" maxStringContentLength="2147483647" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:54893/AttachmentService.svc" 
      binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IAttachmentService" 
      contract="AttachmentsService.IAttachmentService" name="BasicHttpBinding_IAttachmentService" /> 
    </client> 
    </system.serviceModel> 

А вот как я реализовал ссылочный вызов:

public void UploadFile(string serviceUrl,decimal maxFileSize, AttachmentFileParams fileParams, Stream file) 
{ 
    AttachmentServiceClient client = null; 
    try 
    { 
     if (file.Length > (maxFileSize * 1024)) //maxFileSize is defined in KB and file.Length is in Bytes 
        return Serialization.ConvertToJson(new { IsError = true, ErrorMessage = Constants.Messages.MaxFileSizeExceeded + maxFileSize }); 

       string requestUrl = string.Format("{0}/UploadFile", serviceUrl); 
       string jsonFile = Serialization.ConvertToJson(fileParams); 
       byte[] jsonFileBytes = Encoding.UTF8.GetBytes(jsonFile); 
       byte[] len = BitConverter.GetBytes(jsonFileBytes.Length); 

       using (client = new AttachmentServiceClient()) 
       { 
        client.UploadFile(file); 
       } 
    } 
    catch (Exception ex) 
    { } 
    finally 
    { 
     try 
       { 
        if (client.State != System.ServiceModel.CommunicationState.Closed) 
         client.Close(); 
       } 
       catch 
       { 
        client.Abort(); 
       } 
    } 
} 

Есть ли что-нибудь, что мне не хватает?

+0

Может быть, это может вам помочь. http://stackoverflow.com/a/24932150/1660178 –

+0

вам нужно использовать 'transfermode' в вашей привязке. Я думаю. Follow https://msdn.microsoft.com/en-us/library/ms789010(v=vs. 110) .aspx –

ответ

2

Ну, я, наконец, решил это и вот мои конфигурационные файлы, которые работали для меня:

WCF сервис файлового web.config:

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    <httpRuntime maxRequestLength="2147483647" /> 
    </system.web> 

    <system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
    <services> 
     <!-- The name of the service --> 
     <service name="WcfService1.Service1"> 
     <!--you can leave the address blank or specify your end point URI--> 
     <endpoint binding="webHttpBinding" bindingConfiguration="higherMessageSize" contract="WcfService1.IService1" behaviorConfiguration="Web" /> 
     </service> 
    </services> 
    <bindings> 
     <webHttpBinding> 
     <!-- configure the maxReceivedMessageSize value to suit the max size of the request (in bytes) you want the service to receive--> 
     <binding name="higherMessageSize" transferMode="Streamed" maxReceivedMessageSize="2147483647" /> 
     </webHttpBinding> 
    </bindings> 

    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="Web"> 
      <webHttp/> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <!--<serviceHostingEnvironment multipleSiteBindingsEnabled="false" />--> 
    </system.serviceModel> 

    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 
</configuration> 

Client Файл app.config/web.config:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    <httpRuntime maxRequestLength="2147483647" /> 
    </system.web> 

    <system.serviceModel> 
    <bindings> 
     <webHttpBinding> 
     <binding name="BasicHttpBinding_IService1" maxReceivedMessageSize="2147483647" /> 
     </webHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:59540/Service1.svc" behaviorConfiguration="webhttp" 
     binding="webHttpBinding" bindingConfiguration="BasicHttpBinding_IService1" 
     contract="ServiceReference1.IService1" name="BasicHttpBinding_IService1" /> 
    </client> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="webhttp"> 
      <webHttp/> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    </system.serviceModel> 
</configuration> 

Надеюсь, это сэкономит время, потраченное на его решение :-)

0

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

Я нашел Есть два места, которые вы должны изменить свой web.config

<system.web> 
    <httpRuntime maxRequestLength="50000"/> 
</system.web> 

и

<system.webServer> 
    <security> 
    <requestFiltering> 
     <requestLimits maxAllowedContentLength="50000000" /> <!-- Allow files of upto 50,000,000 bytes (about 50Mb) to be uploaded --> 
    </requestFiltering> 
    </security> 
</system.webServer> 

Надеется, что это помогает.

Подробнее здесь: Upload large files

+0

У меня уже есть эти настройки в моем web.config –

Смежные вопросы