我有一些api控制器执行此操作:
public class ProxyController : ApiController {
public async Task<HttpResponseMessage> PostActionAsync(string confirmKey)
{
return await Task<HttpResponseMessage>.Factory.StartNew( () =>
{
var result = GetSomeResult(confirmKey);
return Request.CreateResponse(HttpStatusCode.Created, result);
});
}
}
这是我的api路由配置:
routes.MapHttpRoute("DefaultApi", "api/{controller}/{action}/{id}", new { id = RouteParameter.Optional });
当我尝试对此操作发出任何发布/获取请求时,它会返回“404”错误。我该如何解决?此控制器中的所有其他非异步操作都可以正常工作。
UPD。 JS查询:
$.ajax({
url: Url + '/api/Proxy/PostActionAsync',
type: 'POST',
data: { confirmKey: that.confirmKey },
dataType: 'json',
xhrFields: { withCredentials: true },
success: function (data) {
............
},
error: function (jqXHR, textStatus, errorThrown) {
............
}
});
UPD。通过在动作方法中将[FromBody]
添加到我的参数中解决,就像在J. Steen的回答中一样,现在看起来像是
public class ProxyController : ApiController {
public async Task<HttpResponseMessage> PostActionAsync([FromBody]string confirmKey)
{
var someModel = new SomeResultModel(User.Identity.Name);
await Task.Factory.StartNew(() => someModel.PrepareModel(confirmKey));
return Request.CreateResponse(HttpStatusCode.OK, someModel);
}
}
它有效!
答案 0 :(得分:3)
Web API的路由配置与MVC略有不同。
尝试
routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new { id = RouteParameter.Optional });
请注意丢失的{action}
,因为Web API在调用时自动解决,具体取决于您用于请求的HTTP谓词。
考虑列出的this article on Web API routing(作为示例):
HTTP Method URI Path Action Parameter
GET api/products GetAllProducts (none)
GET api/products/4 GetProductById 4
DELETE api/products/4 DeleteProduct 4
在您的情况下,操作的异步版本也会自动解决。
POST api/products PostActionAsync (Post data)
由于我们现在知道控制器名称,因此请求将是:
GET api/proxy
GET api/proxy/4
POST api/proxy (with post data)
修改强>:
经过额外的研究(简短,我承认),我发现了这个问题。
您需要在in-parameter中添加[FromBody]
。
public async Task<HttpResponseMessage> PostActionAsync([FromBody] string confirmKey)
这与发送 值相结合(没有包装json)可以创造奇迹。将内容类型设置为“application / x-www-form-urlencoded”而不是json,并将参数发送为"=" + that.confirmKey
。
<强>替代强>:
如果您不想弄乱内容类型和前缀= -signs,只需将其作为查询字符串的一部分发送即可。忘记[FromBody]
和其他人。呼叫
/api/Proxy/PostActionAsync?confirmKey=' + that.confirmKey
答案 1 :(得分:1)
这种改变是否可能?
public async Task<HttpResponseMessage> PostActionAsync()
{
var result = await GetSomeResult();
return Request.CreateResponse(HttpStatusCode.Created, result);
}