发布到Web Api参数为空

时间:2014-03-26 21:18:16

标签: asp.net-web-api

我有一个jquery方法,如下所示:

$.post("/api/amazon/signature", { "policy": policy }, function (data) {
    console.log(data);
});

api方法看起来像这样〜:

// POST api/amazon/signature
[HttpPost]
[Route("api/amazon/signature")]
public IHttpActionResult GetSignature([FromBody]string policy)
{
    var bKey = Encoding.ASCII.GetBytes(ConfigurationManager.AppSettings["AWSSecretKey"]);
    var hmacSha1 = new HMACSHA1(bKey);

    var bPolicy = Encoding.ASCII.GetBytes(policy);
    var hash = hmacSha1.ComputeHash(bPolicy);
    var encoded = Convert.ToBase64String(hash);

    return Ok(encoded);
}

但是当我运行此代码时,策略始终为null! 如果我改变我的方法:

public class Signature
{
    public string Policy { get; set; }
}

// POST api/amazon/signature
[HttpPost]
[Route("api/amazon/signature")]
public IHttpActionResult GetSignature([FromBody]Signature model)
{
    var bKey = Encoding.ASCII.GetBytes(ConfigurationManager.AppSettings["AWSSecretKey"]);
    var hmacSha1 = new HMACSHA1(bKey);

    var bPolicy = Encoding.ASCII.GetBytes(model.Policy);
    var hash = hmacSha1.ComputeHash(bPolicy);
    var encoded = Convert.ToBase64String(hash);

    return Ok(encoded);
}

并将我的jquery修改为:

$.post("/api/amazon/signature", { "Policy": policy }, function (data) {
    console.log(data);
});

它工作正常....

有人可以告诉我为什么吗?

1 个答案:

答案 0 :(得分:1)

ASP.NET Web API将请求正文完整绑定到一个参数(仅一个参数而不是更多参数)。默认情况下,body绑定到复杂类型。因此,当您将参数类型更改为复杂类型的Policy时,您不需要实际指定FromBody。现在绑定也正常工作,因为您发送的JSON对象看起来像这个{ "policy": policy }。 Web API在将JSON对象绑定到复杂类型时没有任何问题。

对于简单类型string,在您的情况下,您必须指定FromBody,因为默认情况下Web API会绑定URI路径和查询字符串。但是,在这种情况下,您无法发送JSON对象。 Web API将整个主体绑定到该参数,即string。因此,请求体必须只是一个这样的字符串 - "ABC123"而不是JSON对象。如果您只发送" ABC123"请求正文中的(包括引号),您的string参数将填充ABC123。