Asp Web Api异步操作- 404错误

本文关键字:错误 异步操作 Web Api Asp | 更新日期: 2023-09-27 18:11:16

我有一些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 });

当我尝试对这个动作进行任何Post/Get请求时,它会返回'404'错误。我该怎么修理它?这个控制器中所有其他非异步操作都可以正常工作。

乌利希期刊指南。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]添加到动作参数方法中来解决就像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);
        }
    }

它有效!

Asp Web Api异步操作- 404错误

Web API的路由配置与MVC的工作方式略有不同。

routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new { id = RouteParameter.Optional });

注意缺少的{action},因为它是由Web API在调用时自动解析的,这取决于您为请求使用的HTTP动词。

考虑这篇关于Web API路由的文章,它列出了(作为一个例子):

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

:

如果您不想摆弄内容类型和前缀=-符号,只需将其作为querystring的一部分发送。忘记[FromBody]和其他东西吧。叫

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

本博客提供更多详尽的信息。

这种改变可能吗?

public async Task<HttpResponseMessage> PostActionAsync()
{
    var result = await GetSomeResult();
    return Request.CreateResponse(HttpStatusCode.Created, result);
}