c#-在到达ModelBinder之前推进Request.InputStream
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-在到达ModelBinder之前推进Request.InputStream,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2369字,纯文字阅读大概需要4分钟。
内容图文
![c#-在到达ModelBinder之前推进Request.InputStream](/upload/InfoBanner/zyjiaocheng/661/10d4d674a7184f96b096d3ef421a7772.jpg)
在我们的MVC 2应用程序中,我们实现了一个JSON模型绑定程序,如下所示:
public virtual object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
string input;
using (var reader = new StreamReader(controllerContext.HttpContext.Request.InputStream))
{
input = reader.ReadToEnd();
}
return JsonConvert.DeserializeObject(
input,
bindingContext.ModelType);
}
更新到MVC 4后,我注意到对于传入的JSON帖子,我们得到的传入模型为空.当进行挖掘时,很明显上游出现了一些东西.修复起来很容易,就像这样
public virtual object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
string input;
//something upstream after MVC 4 upgrade is advancing the stream to end before we can read it
controllerContext.HttpContext.Request.InputStream.Position = 0;
using (var reader = new StreamReader(controllerContext.HttpContext.Request.InputStream))
{
input = reader.ReadToEnd();
}
return JsonConvert.DeserializeObject(
input,
bindingContext.ModelType);
}
但是我想知道发生了什么,因此有必要进行更改吗?先前的实现是否只是巧合?
解决方法:
否,之前的实现并非偶然.
ASP.NET MVC 3引入了内置的JSON绑定支持,该支持使操作方法可以接收JSON编码的数据并将其模型绑定到操作方法参数.
默认情况下,JsonValueProviderFactory在ASP.NET MVC 3及更高版本中注册. JSON值提供程序在模型绑定之前运行,并将请求数据序列化为字典.然后将字典数据传递到模型绑定程序.
让我们看一下JsonValueProviderFactory的工作原理.这是ASP.NET MVC开放源代码JsonValueProviderFactory.cs中提供的JsonValueProviderFactory源代码的链接.
如果Content-Type设置为application / json,则JsonValueProviderFactory.cs中定义的GetDeserializedObject方法读取流,因此它将Request.InputStream留在流的末尾.因此,这里先调用GetDeserializedObject,然后再调用BindModel.以来
GetDeserializedObject已经读取了一次流,并将Request.InputStream推进到流的末尾,我们需要在BindModel中再次重置Request.InputStream.
private static object GetDeserializedObject(ControllerContext controllerContext)
{
if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
{
// not JSON request
return null;
}
StreamReader reader = new StreamReader(controllerContext.HttpContext.Request.InputStream);
string bodyText = reader.ReadToEnd();
if (String.IsNullOrEmpty(bodyText))
{
// no JSON data
return null;
}
JavaScriptSerializer serializer = new JavaScriptSerializer();
object jsonData = serializer.DeserializeObject(bodyText);
return jsonData;
}
内容总结
以上是互联网集市为您收集整理的c#-在到达ModelBinder之前推进Request.InputStream全部内容,希望文章能够帮你解决c#-在到达ModelBinder之前推进Request.InputStream所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。