gpt4 book ai didi

c# - Asp Web Api 异步操作 - 404 错误

转载 作者:行者123 更新时间:2023-11-30 20:58:13 25 4
gpt4 key购买 nike

我有一些执行此操作的 api Controller :

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 });

当我尝试对此操作发出任何 Post/Get 请求时,它会返回“404”错误。我该如何解决?此 Controller 中的所有其他非异步操作都可以正常工作。

更新。 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) {
............
}
});

更新。通过将 [FromBody] 添加到我在 action 方法中的参数来解决,就像 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);
}
}

而且有效!

最佳答案

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)

因为我们现在知道 Controller 名称,请求将是这样的:

GET api/proxy
GET api/proxy/4
POST api/proxy (with post data)

编辑:

经过额外的研究(简短,我承认)我发现了这个问题。

您需要在输入参数前添加[FromBody]

public async Task<HttpResponseMessage> PostActionAsync([FromBody] string confirmKey)

这与发送 just 值(无包装 json)相结合会产生奇迹。将内容类型设置为“application/x-www-form-urlencoded”而不是 json,并将您的参数作为 "="+ that.confirmKey 发送。

备选方案:

如果您不想摆弄内容类型和前缀 =-符号,只需将其作为查询字符串的一部分发送即可。忘记 [FromBody] 和其他的。调用

/api/Proxy/PostActionAsync?confirmKey=' + that.confirmKey

Additional, exhaustive information in this blog .

关于c# - Asp Web Api 异步操作 - 404 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16282041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com