什么是Request.InputStream,何时使用它?

16

问题非常简单。什么是Request.InputStream,什么时候使用它。它是否总是用于读取在post请求中发送的整个html body,还是仅用于其中发送的一些参数?为什么不应该通过将数据作为参数传递给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个回答

9
Request.InputStream 允许您访问原始请求数据。如果这些数据使用一些标准格式(如application/x-www-form-urlencodedmultipart/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方法来将请求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);
    }
});

如何在C#中读取“ application/octet-stream”类型的文件? - ManirajSS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接