IIS Express 8 — максимально допустимая длина

Если приведенное ниже слишком длинное, мой вопрос заключается в том, подчиняется ли 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()

person mrK    schedule 16.06.2015    source источник
comment
Ваши числа настолько велики, что их можно считать недействительными и игнорировать. Или, не дай Бог, переполниться. Установите их на 10M, что достаточно для этого запроса. И убедитесь, что они в байтах, кто знает.   -  person usr    schedule 16.06.2015
comment
Просто совет, замените throw t.Exception; на t.Wait(). Это лучше обрабатывает ошибку и не уничтожает сохраненный стек. Вероятно, вам все равно не следует использовать ContinueWith и использовать await.   -  person usr    schedule 16.06.2015
comment
@usr Да, я какое-то время пользовался ожиданием, но я хотел все изменить и посмотреть, работает ли какой-нибудь режим.   -  person mrK    schedule 16.06.2015
comment
@usr Что касается вашего первого комментария, .Net фактически выдает ошибку конфигурации, если вы переполняете эту запись. В MSDN значение, которое я ввел, является максимальным допустимым значением, и оно должно работать для этого.   -  person mrK    schedule 16.06.2015
comment
На самом деле, я забыл кое-что важное. Опубликуйте полное исключение ToString. Обычно это первое, о чем я прошу, не знаю, почему я забыл.   -  person usr    schedule 16.06.2015
comment
Превышение maxAllowedContentLength вернет статус 404.13. Вы понимаете это? Это ограничение является ограничением IIS, мне кажется, ваша проблема в вашем приложении. Возможно, у MultipartFormDataStreamProvider есть свои ограничения.   -  person Peter Hahndorf    schedule 16.06.2015
comment
@usr Извините, у меня дважды произошел сбой Visual Studio. Я разместил как исключение, так и внутреннее исключение   -  person mrK    schedule 16.06.2015
comment
@PeterHahndorf Я этого не понимаю, но обрабатывает ли webapi это поведение иначе, чем обработчик ASP.Net? Если нет, то это может быть полностью MultipartFormDataStreamProvider, но в Интернете пока нет никаких ограничений для этого.   -  person mrK    schedule 16.06.2015
comment
@mrK - maxAllowedContentLength не имеет ничего общего с ASP.Net, это IIS. Исключение составляет System.Web.HttpBufferlessInputStream, который является ASP.Net. Я не помню, есть ли для этого отдельная настройка.   -  person Peter Hahndorf    schedule 16.06.2015
comment
В system.web/httpRuntime есть атрибут maxRequestLength, по умолчанию 4096, вы можете изучить это.   -  person Peter Hahndorf    schedule 16.06.2015


Ответы (2)


Давайте посмотрим на код, который выдает:

private void ValidateRequestEntityLength()
{
    if (!this._disableMaxRequestLength && (this.Length > this._maxRequestLength))
    {
        if (!(this._context.WorkerRequest is IIS7WorkerRequest))
        {
            this._context.Response.CloseConnectionAfterError();
        }
        throw new HttpException(SR.GetString("Max_request_length_exceeded"), null, 0xbbc);
    }
}

ctor устанавливает эти параметры:

internal HttpBufferlessInputStream(HttpContext context, bool persistEntityBody, bool disableMaxRequestLength)
{
    this._context = context;
    this._persistEntityBody = persistEntityBody;
    this._disableMaxRequestLength = disableMaxRequestLength;
    HttpRuntimeSection httpRuntime = RuntimeConfig.GetConfig(this._context).HttpRuntime;
    this._maxRequestLength = httpRuntime.MaxRequestLengthBytes;
    this._fileThreshold = httpRuntime.RequestLengthDiskThresholdBytes;
    if (this._persistEntityBody)
    {
        this._rawContent = new HttpRawUploadedContent(this._fileThreshold, this._context.Request.ContentLength);
    }
    int contentLength = this._context.Request.ContentLength;
    this._remainingBytes = (contentLength > 0) ? contentLength : 0x7fffffff;
    this._length = contentLength;
}

И вы можете использовать эту функцию HttpRequest, чтобы отключить ограничение:

public Stream GetBufferlessInputStream(bool disableMaxRequestLength)
{
    return this.GetInputStream(false, disableMaxRequestLength);
}

Если вы хотите узнать, как вычисляется лимит байтов, декомпилируйте httpRuntime.MaxRequestLengthBytes.

person usr    schedule 16.06.2015
comment
Итак, все это делается в контроллере WebAPI, поэтому Request на самом деле является HttpRequestMessage, а не HttpRequest. HttpRequestMessage, похоже, не имеет метода GetBufferlessInputStream. - person mrK; 16.06.2015
comment
На самом деле, с небольшой помощью от этого я смог заставить его работать. Спасибо за помощь! stackoverflow.com/ вопросы/25753248/ - person mrK; 16.06.2015

просто мысль, но из: http://www.smarterasp.net/support/kb/a1544/how-to-resolve-maximum-request-length-exceeded.aspx

«maxAllowedContentLength измеряется в байтах, а maxRequestLength измеряется в килобайтах»

проверьте, что они оба установлены правильно, и повторите попытку.

person AaronReynoldsUK    schedule 16.06.2015
comment
В любом случае, они должны быть установлены правильно. Я обновлю свой пост с фактическим значением конфигурации - person mrK; 16.06.2015