问题真的很简单。什么是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);
}
});
发布于 2011-11-14 15:00:57
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
方法将请求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);
}
});
https://stackoverflow.com/questions/8110016
复制相似问题