使用 MVC 从 POST 的主体绑定单个值

Binding single value from the body of a POST with MVC

我正在 ASP.NET MVC 中实现一个协议,我需要能够从这样的请求中绑定数据:

curl -H "Content-Type: application/json" -d 'true' http://example.com/operation/some_id

我试过在我的控制器中使用参数的 [FromBody] 属性,如下所示:

public ActionResult Operation(string id, [FromBody] bool setSomething)

上面的代码不起作用,因为它在 MVC 尝试将 setSomething 设置为 null 时抛出异常。如果我将 setSomething 更改为字符串,它总是设置为 null,因此我无法在操作中将其解析为布尔值。

我没有将 'true' 更改为 '=true' 的奢侈,正如我在其他地方看到类似问题时所读到的那样。从上面的 curl 命令生成的 POST 是一成不变的。我需要的是从 POST 的正文中获取值 true(这是有效的 json,即使没有密钥)并将其分配给 setSomething。我还需要以不阻止我将 some_id 分配给 id 的方式执行此操作,因为我已经在使用自定义路由。

有谁知道如何在 MVC 或 Web API 中实现这一点?

感谢任何帮助。

我找到了解决方案,但它更像是一种解决方法。

当 POST 的主体只是 truefalse 但仅此而已时,没有绑定此值的键。因此,除了通过 JSON 反序列化器 运行 值之外,MVC 实际上没有任何它可以做的事情,它在没有在操作中设置任何参数的情况下成功。

最后只好直接从Request中读取值,如所述。

我最终使用了类似的代码:

public ActionResult Operation(string id)
{
    var req = Request.InputStream;
    req.Seek(0, SeekOrigin.Begin);
    string rawBody = new StreamReader(req).ReadToEnd();

    bool setSomething = false;

    if(bool.TryParse(rawBody, out setSomething))
    {
        // Do something with 'setSomething'
        return Json(new { id = id, status = setSomething });
    }
    throw new ArgumentException(string.Format("{0} is not a valid boolean value", rawBody));
}

如您所见,我从参数列表中完全删除了 setSomething,并依靠读取请求的原始输入流来获取值。这一点也不优雅,也没有利用我们从 MVC 框架中获得的所有好处,但它确实有效。