Я пытаюсь выполнить загрузку файлов в моей службы 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>
http://stackoverflow.com/questions/10122957/iis7-413-request-entity-too-large-uploadreadaheadsize – dremerDT
Спасибо за комментарий. Я использовал размер файла 22,4 КБ, он успешно загружен с использованием 1-го кода (массив фиксированного размера). Если я разбил размер файла в кратных 1024 байтах и попытался отправить, тогда возникла проблема. – Ashok
Кажется, что вы не отправляете данные службе в куски - вы создаете поток в кусках, но вы отправляете его как один запрос. Можете ли вы опубликовать конфигурацию привязки своего сервиса (предпочтительно, раздел '' конфигурации, предпочтительно).Скорее всего, вы либо не создали конкретную привязку, либо не назначили указанную привязку явной конечной точке. –
Tim