我有一个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);
}但是,当我运行这段代码时,策略总是为空!如果我将我的方法改为:
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);
});效果很好..。
谁能告诉我原因吗?
发布于 2014-03-27 00:58:01
ASP.NET Web将整个请求体绑定到一个参数(只有一个参数,而不是多个参数)。默认情况下,主体绑定到复杂类型。因此,当您将参数类型更改为Policy (这是一个复杂的类型)时,不需要实际指定FromBody。此外,绑定现在运行正常,因为您正在发送类似于此{ "policy": policy }的JSON对象。Web在将JSON对象绑定到复杂类型方面没有问题。
对于一个简单的类型,在您的例子中,string,您必须指定FromBody,因为默认情况下,Web从URI路径和查询字符串绑定。但是,在这种情况下,您不能发送JSON对象。Web将将整个主体绑定到该参数,即string。因此,请求体必须是这样的字符串- "ABC123",而不是JSON对象。如果您只在请求体中发送" ABC123“(包括引号),则string参数将使用ABC123填充。
https://stackoverflow.com/questions/22673272
复制相似问题