Что такое Request.InputStream и когда его использовать?

Вопрос очень прост. Что такое Request.InputStream и когда его использовать. Всегда ли он используется для чтения всего тела html, отправленного в почтовом запросе, или только некоторые параметры, отправленные в нем? Почему я не должен отправлять данные в качестве параметра на свой код на стороне сервера, передавая его в запросе Ajax?

В примере я могу либо передать параметр в data:, либо я могу прочитать параметр в Request.InputStream. Когда я должен использовать какой?

Пример:

В контроллере:

    public ActionResult GetSomeData(string someData)
    {
        Request.InputStream.Position = 0;
        System.IO.StreamReader str = new System.IO.StreamReader(Request.InputStream);
        string sBuf = str.ReadToEnd();
        return Json("something");
    }

Запрос Ajax:

        $.ajax({
            type: "POST",
            url: "Home/GetSomeData",
            data: "{someData:'Hello'}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (msg) {
                alert(msg);
                // Insert the returned HTML into the <div>.
                $('#dvResult').html(msg);
            }
        });

Ответ 1

Request.InputStream позволяет вам получить доступ к необработанным данным запроса. Если эти данные отформатированы с использованием стандартного формата, например application/x-www-form-urlencoded или multipart/form-data, или другого формата, который понимает связующее устройство по умолчанию, вам не нужно использовать Request.InputStream. ASP.NET будет анализировать значения запроса, и вы сможете получить к ним доступ напрямую, используя Request[...]. Конечно, в ASP.NET MVC вам даже не нужно использовать Request[...], потому что вы можете определить модель представления, которую действие вашего контроллера будет принимать в качестве параметра, и оставить привязку модели назначить свои свойства из запроса.

Бывают случаи, когда вы захотите получить доступ к необработанному потоку запросов. Например, вы создали какой-то пользовательский протокол, и клиент отправляет в поток запросов некоторые форматированные данные. Эти случаи очень редки, поскольку изобретение пользовательских протоколов не очень распространено.

Теперь вернемся к вашему вопросу. В вашем случае вы можете определить модель представления:

public class MyViewModel
{
    public string SomeData { get; set; }
}

которое действие вашего контроллера будет принимать в качестве аргумента:

public ActionResult GetSomeData(MyViewModel model)
{
    // model.SomeData will contain the Hello string that the client sent
    return Json("something");
}

и на клиенте я бы рекомендовал вам использовать метод JSON.stringify, который изначально встроен в современные браузеры, чтобы JSON сериализовал литерал javascript запроса в строку JSON вместо ручной записи JSON, как вы это делали:

$.ajax({
    type: 'POST',
    url: 'Home/GetSomeData',
    data: JSON.stringify({ someData: 'Hello' }),
    contentType: 'application/json; charset=utf-8',
    success: function (msg) {
        alert(msg);
        // Insert the returned HTML into the <div>.
        $('#dvResult').html(msg);
    }
});