我有一个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);
});
它工作正常....
有人可以告诉我为什么吗?
答案 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。