Что такое Request.InputStream и когда его использовать? - PullRequest
10 голосов
/ 13 ноября 2011

Вопрос действительно прост. Что такое 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 Ответ

8 голосов
/ 14 ноября 2011

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);
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...