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

Posted

技术标签:

【中文标题】什么是 Request.InputStream 以及何时使用它?【英文标题】:what is Request.InputStream and when to use it? 【发布时间】:2011-12-27 22:38:09 【问题描述】:

问题真的很简单。什么是Request.InputStream 以及何时使用它。它总是用于读取在 post 请求中发送的整个 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-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'类型的文件?

以上是关于什么是 Request.InputStream 以及何时使用它?的主要内容,如果未能解决你的问题,请参考以下文章

xml 响应 http post - 将 request.inputstream 转换为字符串 - asp.net

传递给后台的Json数据解析

客户端调用web api 的post请求,传入一个字符串时,用此方法获取此字符串。

[转]C#中POST数据和接收的几种方式

C# .NET MVC 接收 JSON ,POST,WCF 无缝隙切换

获取post过来的stream数据