[英]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.