Если приведенное ниже слишком длинное, мой вопрос заключается в том, подчиняется ли IIS Express 8 в Visual Studio 2013 атрибуту maxAllowedContentLength
или имеет какое-то переопределяющее значение, которое предотвращает большие запросы.
При отладке некоторых вызовов webapi для Visual Studio 2013 я получаю эту ошибку:
Maximum request length exceeded.
Я искал в Интернете, и все, кажется, указывает на эти две записи конфигурации:
IIS 6-: maxRequestLength
IIS 7+: maxAllowedContentLength
Я добавил обе эти записи конфигурации в свой web.config со значением 4294967295, на всякий случай. Когда я пытаюсь позвонить в контроллер, я все еще получаю сообщение об ошибке.
Это заставило меня подумать, что я отправляю какой-то гигантский объем данных на сервер, но fiddler говорит мне следующее:
Request Count: 1
Bytes Sent: 4,327,084 (headers:1,026; body:4,326,058)
Bytes Received: 3,808 (headers:434; body:3,374)
И видя, как 4 327 084 ‹ 4 294 967 295, я чувствую, что с этим запросом не должно быть никаких проблем.
Следующее место, которое я хотел посмотреть, это код моего сервера:
if (!Request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
var provider = new MultipartFormDataStreamProvider(@"C:\tmp", Int32.MaxValue);
var task = Request.Content.ReadAsMultipartAsync(provider).ContinueWith(t =>
{
if (t.IsFaulted || t.IsCanceled)
throw t.Exception; // <== This gets thrown
Так что еще раз, размер запроса значительно меньше, чем размер буфера для поставщика потока данных.
В общем, я понятия не имею, что происходит. Запрос довольно большой, но из того, что я могу сказать, нет никаких причин, по которым это должно потерпеть неудачу. Это вызвано VS13/IIS Exp8? Или есть что-то еще, что мне не хватает?
Заранее благодарим за любую помощь, которую вы можете предложить.
Вот запись конфигурации, которую я обещал предоставить
<requestLimits maxAllowedContentLength="4294967295" />
А вот и полное исключение
System.IO.IOException: Error reading MIME multipart body part. ---> System.Web.HttpException: Maximum request length exceeded.
at System.Web.HttpBufferlessInputStream.ValidateRequestEntityLength()
at System.Web.HttpBufferlessInputStream.GetPreloadedContent(Byte[] buffer, Int32& offset, Int32& count)
at System.Web.HttpBufferlessInputStream.BeginRead(Byte[] buffer, Int32 offset, Int32 count, AsyncCallback callback, Object state)
at System.IO.Stream.<BeginEndReadAsync>b__d(Stream stream, ReadWriteParameters args, AsyncCallback callback, Object state)
at System.Threading.Tasks.TaskFactory`1.FromAsyncTrim[TInstance,TArgs](TInstance thisRef, TArgs args, Func`5 beginMethod, Func`3 endMethod)
at System.IO.Stream.BeginEndReadAsync(Byte[] buffer, Int32 offset, Int32 count)
at System.IO.Stream.ReadAsync(Byte[] buffer, Int32 offset, Int32 count, CancellationToken cancellationToken)
at System.Web.Http.WebHost.SeekableBufferedRequestStream.<ReadAsync>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at System.Net.Http.HttpContentMultipartExtensions.<MultipartReadAsync>d__8.MoveNext()
--- End of inner exception stack trace ---
at System.Net.Http.HttpContentMultipartExtensions.<MultipartReadAsync>d__8.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
at System.Net.Http.HttpContentMultipartExtensions.<ReadAsMultipartAsync>d__0`1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at BICWeb.webservices.controllers.FormsDesignerController.<Post>d__b.MoveNext() in c:\code\BIC_CORE\TRUNK\BIC\src\BICWeb\webservices\controllers\FormsDesignerController.cs:line 300
И внутреннее исключение
System.Web.HttpException (0x80004005): Maximum request length exceeded.
at System.Web.HttpBufferlessInputStream.ValidateRequestEntityLength()
at System.Web.HttpBufferlessInputStream.GetPreloadedContent(Byte[] buffer, Int32& offset, Int32& count)
at System.Web.HttpBufferlessInputStream.BeginRead(Byte[] buffer, Int32 offset, Int32 count, AsyncCallback callback, Object state)
at System.IO.Stream.<BeginEndReadAsync>b__d(Stream stream, ReadWriteParameters args, AsyncCallback callback, Object state)
at System.Threading.Tasks.TaskFactory`1.FromAsyncTrim[TInstance,TArgs](TInstance thisRef, TArgs args, Func`5 beginMethod, Func`3 endMethod)
at System.IO.Stream.BeginEndReadAsync(Byte[] buffer, Int32 offset, Int32 count)
at System.IO.Stream.ReadAsync(Byte[] buffer, Int32 offset, Int32 count, CancellationToken cancellationToken)
at System.Web.Http.WebHost.SeekableBufferedRequestStream.<ReadAsync>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at System.Net.Http.HttpContentMultipartExtensions.<MultipartReadAsync>d__8.MoveNext()
throw t.Exception;
наt.Wait()
. Это лучше обрабатывает ошибку и не уничтожает сохраненный стек. Вероятно, вам все равно не следует использовать ContinueWith и использовать await. - person usr   schedule 16.06.2015maxAllowedContentLength
вернет статус 404.13. Вы понимаете это? Это ограничение является ограничением IIS, мне кажется, ваша проблема в вашем приложении. Возможно, уMultipartFormDataStreamProvider
есть свои ограничения. - person Peter Hahndorf   schedule 16.06.2015maxAllowedContentLength
не имеет ничего общего с ASP.Net, это IIS. Исключение составляет System.Web.HttpBufferlessInputStream, который является ASP.Net. Я не помню, есть ли для этого отдельная настройка. - person Peter Hahndorf   schedule 16.06.2015system.web/httpRuntime
есть атрибутmaxRequestLength
, по умолчанию 4096, вы можете изучить это. - person Peter Hahndorf   schedule 16.06.2015