ASP.NET MVC игнорирует Content-Length? - PullRequest
1 голос
/ 20 декабря 2010

У меня были некоторые проблемы с отсутствующими данными постов в ASP.NET MVC, что привело меня к исследованию того, как ASP.NET MVC работает с недопустимыми длинами содержимого.Я предполагал, что сообщение с недопустимой длиной содержимого должно игнорироваться MVC.NET, но, похоже, это не так.

В качестве примера попробуйте создать новое веб-приложение ASP.NET MVC 2и добавьте это действие в HomeController:

public ActionResult Test(int userID, string text)
{
    return Content("UserID = " + userID + " Text = " + text);
}

Попытайтесь создать простую форму, которая отправляет сообщение в вышеуказанное действие, запустите fiddler и (используя «Построитель запросов») измените необработанные данные, чтобы некоторые данные формыотсутствует (например, удалить текстовый параметр).Перед выполнением запроса не забудьте снять флажок «Исправить заголовок длины содержимого» в параметрах «Построитель запросов», затем установить точку останова в приведенном выше коде и выполнить пользовательский запрос http.

Я считаю, чтозапрос занимает намного больше времени, чем обычно (30 секунд или около того), но, к моему изумлению, все еще обрабатывается действием контроллеров.Кто-нибудь знает, является ли это ожидаемым поведением и, если да, что бы вы порекомендовали защитить от недопустимых длин контента?

1 Ответ

2 голосов
/ 20 декабря 2010

ASP.NET не игнорирует заголовок запроса Content-Length.Рассмотрим в качестве примера следующее действие контроллера, которое просто возвращает параметр foo:

[HttpPost]
public ActionResult Index(string foo)
{
    return Content(foo, "text/plain");
}

Теперь давайте сделаем правильный POST-запрос к нему:

using (var client = new TcpClient("127.0.0.1", 2555))
using (var stream = client.GetStream())
using (var writer = new StreamWriter(stream))
using (var reader = new StreamReader(stream))
{
    writer.Write(
@"POST /home/index HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: localhost:2555
Content-Length: 10
Connection: close

foo=foobar");
    writer.Flush();
    Console.WriteLine(reader.ReadToEnd());
}

Как и ожидалось, это печатаетзаголовки ответа HTTP (которые не важны) и в теле мы имеем foobar.Теперь попробуйте уменьшить заголовок Content-Length запроса:

POST /home/index HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: localhost:2555
Content-Length: 5
Connection: close

foo=foobar

, который возвращает один f в теле ответа.Поэтому, как вы видите, неверный HTTP-запрос может привести к неправильному анализу параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...