2015-10-13 3 views
0

Я пытаюсь выполнить загрузку файлов в моей службы WCF в ASP .NET C#загрузки файла в службы WCF (413) Request Entity Too Large

Вот код в WCF сервера для загрузки файла.

public void FileUpload(string fileName, Stream fileStream) 
     { 
      FileStream fileToupload = new FileStream("D:\\FileUpload\\" + fileName, FileMode.Create); 

     // byte[] bytearray = new byte[10000]; 
      byte[] bytearray = new byte[1000]; 
      int bytesRead, totalBytesRead = 0; 
      do 
      { 
       bytesRead = fileStream.Read(bytearray, 0, bytearray.Length); 
       totalBytesRead += bytesRead; 
       if(bytesRead > 0) 
       fileToupload.Write(bytearray, 0, bytearray.Length); 

      } while (bytesRead > 0); 

     // fileToupload.Write(bytearray, 0, bytearray.Length); 
      fileToupload.Close(); 
      fileToupload.Dispose(); 



     } 

Вот код для клиента, чтобы загрузить файл: (Fixed Byte Array Size)

protected void bUpload_Click(object sender, EventArgs e) 
{ 
    byte[] bytearray = null; 
    Stream stream; 
    string fileName = ""; 
    //throw new NotImplementedException(); 
    if (FileUpload1.HasFile) 
    { 
     fileName = FileUpload1.FileName; 
     stream = FileUpload1.FileContent; 
     stream.Seek(0, SeekOrigin.Begin); 
     bytearray = new byte[stream.Length]; 
     int count = 0; 
     while (count < stream.Length) 
     { 
      bytearray[count++] = Convert.ToByte(stream.ReadByte()); 
     } 

    } 

    string baseAddress = "http://localhost/WCFService/Service1.svc/FileUpload/"; 

    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(baseAddress + fileName); 
    request.Method = "POST"; 
    request.ContentType = "text/plain"; 
    Stream serverStream = request.GetRequestStream(); 
    serverStream.Write(bytearray, 0, bytearray.Length); 
    serverStream.Close(); 
    try 
    { 
     using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
     { 
      int statusCode = (int)response.StatusCode; 
      System.Diagnostics.Debug.WriteLine("statusCode: " + statusCode); 

      StreamReader reader = new StreamReader(response.GetResponseStream()); 
      System.Diagnostics.Debug.WriteLine("reader: " + reader.ToString()); 

     } 
    } 
    catch (Exception ex) 
    { 
     System.Diagnostics.Debug.WriteLine("--- EXCEPTION ---"); 
     ex.ToString(); 
    } 
} 

Это работает хорошо с небольшим размером файлом, когда я пытался с большими файлами размера Я изменил массив байтов фиксированного размера на динамический массив байтов. Запись в поток. Здесь обновляются код: (куски 1024 байт массива байт используются для отправки данных)

 request.Method = "POST"; 
     request.ContentType = "text/plain"; 
     // Stream serverStream = request.GetRequestStream(); 

     if (FileUpload1.HasFile) 
     { 
      fileName = FileUpload1.FileName; 
      stream = FileUpload1.FileContent; 
      stream.Seek(0, SeekOrigin.Begin); 
      bytearray = new byte[1024];//stream.Length]; 


     } 
     int TbyteCount = 0; 
     Stream requestStream = request.GetRequestStream(); 

      int bufferSize = 1024; 
      byte[] buffer = new byte[bufferSize]; 
      int byteCount = 0; 
      while ((byteCount = stream.Read(buffer, 0, bufferSize)) > 0) 
      { 
       TbyteCount = TbyteCount + byteCount; 
       requestStream.Write(buffer, 0, byteCount); 
      } 

      requestStream.Close(); 


     try 
     { 
      using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
      { 
       int statusCode = (int)response.StatusCode; 
       System.Diagnostics.Debug.WriteLine("statusCode: " + statusCode); 

       StreamReader reader = new StreamReader(response.GetResponseStream()); 
       System.Diagnostics.Debug.WriteLine("reader: " + reader.ToString()); 

      } 
     } 
     catch (Exception ex) 
     { 
      System.Diagnostics.Debug.WriteLine("--- EXCEPTION ---"); 
      ex.ToString(); 
     } 
    } 

Но время чтения ответа я получаю исключение Удаленный сервер возвратил ошибку: (413) Request Entity Too Большой.

Я делаю правильно с написанием несколько раз в потоке запросов!?

Я использовал размер файла 22,4 КБ, он успешно загружен с использованием 1-го кода (массив фиксированного размера) Если я разбил размер файла в несколько кратных 1024 байта и попытался отправить, тогда возникла проблема.

файл Web.config

<?xml version="1.0"?> 
<configuration> 
    <appSettings> 
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/> 
    </appSettings> 
    <system.web> 
    <compilation debug="true"/> 
    </system.web> 
    <system.serviceModel> 
    <services> 
     <service name="WcfServiceApp.Service1" behaviorConfiguration="ServiceBehavior"> 
     <endpoint address="" binding="webHttpBinding" contract="WcfServiceApp.IService1" behaviorConfiguration="webBehaviour"/> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:50327/Service1.svc"/> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="ServiceBehavior"> 
      <!-- To avoid disclosing metadata information, set the values below to false before deployment --> 
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
      <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="webBehaviour"> 
      <webHttp/> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <!--<protocolMapping> 
     <add binding="basicHttpsBinding" scheme="https"/> 
    </protocolMapping>--> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/> 
    </system.serviceModel> 
    <system.webServer> 
    <httpProtocol> 
     <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="*"/> 
     <add name="Access-Control-Allow-Headers" value="Content-Type, Accept"/> 
     </customHeaders> 
    </httpProtocol> 
    <directoryBrowse enabled="true"/> 
    </system.webServer> 
</configuration> 
+0

http://stackoverflow.com/questions/10122957/iis7-413-request-entity-too-large-uploadreadaheadsize – dremerDT

+0

Спасибо за комментарий. Я использовал размер файла 22,4 КБ, он успешно загружен с использованием 1-го кода (массив фиксированного размера). Если я разбил размер файла в кратных 1024 байтах и ​​попытался отправить, тогда возникла проблема. – Ashok

+0

Кажется, что вы не отправляете данные службе в куски - вы создаете поток в кусках, но вы отправляете его как один запрос. Можете ли вы опубликовать конфигурацию привязки своего сервиса (предпочтительно, раздел '' конфигурации, предпочтительно).Скорее всего, вы либо не создали конкретную привязку, либо не назначили указанную привязку явной конечной точке. – Tim

ответ

1

При попытке передать большой сериализованную объекта с некоторой структурой этой проблемой, как правило, вызванной утечкой maxItemsInObjectGraph в конфигурации. См. Мой answer here

Но в вашем случае вы пытаетесь просто передать простой файл данных в виде потока байтов. Чтобы сделать это через webHttpBinding, вы должны указать надлежащий контракт на обслуживание, который принимает только сообщение потока как вход. Все дополнительные материалы, такие как имена файлов, которые вы можете указать в качестве заголовков в контракте с сообщением (на самом деле, возможно, вы с именем файла как параметр из URI также будете работать). Затем вы должны установить TransferMode = TransferMode.Streamed для привязки. Некоторые code example is here Еще один with config samples is here.

Ключевые слова для дополнительного Googling является WebHttpBinding потокового

+0

Я добавил webhttpbinding, он сработал. Спасибо за ссылки – Ashok

1

В креплениях услуг, увеличение читателя квоты. Подробнее о каждой настройке читайте здесь https://msdn.microsoft.com/en-us/library/ms731325(v=vs.110).aspx. АОЛ изучить этот https://msdn.microsoft.com/en-us/library/system.servicemodel.basichttpbinding.maxreceivedmessagesize(v=vs.100).aspx

+0

Я думаю, что проблема заключается в Отсылке кусков данных, всего 1024 байта. Я обновил вопрос. – Ashok

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