簡體   English   中英

WCF服務(413)請求實體中的文件上傳過大

[英]File upload in WCF Service (413) Request Entity Too Large

我正在嘗試在ASP .NET C#中將文件上傳到我的WCF服務中

這是WCF Server中用於文件上傳的代碼。

 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();



       }

這是客戶端上傳文件的代碼:( 固定字節數組大小)

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();
    }
}

對於較小的文件,這是很好的方法,當我嘗試使用較大的文件時,我將固定大小的字節數組更改為動態字節數組。 這是更新的代碼:( 用於發送數據的Byte數組的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)請求實體太大。

我在請求流中多次寫入是否正確!?

我使用的文件大小為22.4 KB,使用第一個代碼(固定大小的數組)已成功上傳。如果我將文件大小分割為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>

當您嘗試傳輸具有某些結構的大序列化對象時 ,通常會由於配置中maxItemsInObjectGraph的泄漏而導致此問題。 在這里查看我的答案

但是在您的情況下,您嘗試僅將簡單的數據文件作為字節流傳輸。 要通過webHttpBinding做到這一點,您應該指定適當的服務協定,該協定接受流消息作為輸入。 您可以在消息協定中將所有其他內容(例如文件名)指定為標頭(實際上,也許您也可以使用URI中的文件名作為參數)。 然后,必須為綁定設置TransferMode = TransferMode.Streamed 這里有一些代碼示例,這里 還有配置示例

額外搜尋的關鍵字是webhttpbinding流

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM