0

我有

[HttpPost]        
public ActionResult Foo()
{
    // read HTTP payload
    var reqMemStream = new MemoryStream(HttpContext.Request.BinaryRead(HttpContext.Request.ContentLength));
 ....
}

有效载荷是application/json;工作正常;然后我改为

public ActionResult Foo(string thing)
{
....
}

目的是发布到MyController/Foo?thing=yo 现在我无法读取有效负载(长度正确但流为空)。我的猜测是控制器管道已经吃掉了寻找可以映射到方法参数的表单发布数据的有效负载。有什么方法可以阻止这种行为(当然 MVC 不应该吃掉类型标记为 JSON 的有效负载,它应该只查看表单发布数据)。我的解决方法是在 json 中添加“东西”,但我不太喜欢

4

1 回答 1

3

在读取之前尝试重置输入流位置:

public ActionResult Foo(string thing)
{
    Request.InputStream.Position = 0;
    var reqMemStream = new MemoryStream(HttpContext.Request.BinaryRead(HttpContext.Request.ContentLength));
    ....
}

话虽如此,如果您要发送application/json有效负载,为什么在神圣的地球上您还要费心直接读取请求流,而不是简单地定义和使用视图模型:

public class MyViewModel
{
    public string Thing { get; set; }
    public string Foo { get; set; }
    public string Bar { get; set; }
    ...
}

进而:

public ActionResult Foo(MyViewModel model)
{
    // use the model here 
    ....
}

ASP.NET MVC 3 有一个内置功能,JsonValueProviderFactory可让您自动将 JSON 请求绑定到模型。如果您使用的是旧版本,那么添加这样的工厂非常容易,正如 Phil Haack 在他的博客文章中所说明的那样。

于 2012-05-25T06:20:14.437 回答