繁体   English   中英

Web API路线404:“在匹配的控制器上未找到任何动作”

[英]Web API Route 404: “No action was found on the controller that matches”

我不断收到404,看不到为什么?

GLOBAL.ASAX:

protected void Application_Start(object sender, EventArgs e)
{
    // GetApi - Allows for:
    // - GET: With or without an Id (because id is marked as 'optional' in defaults)
    RouteTable.Routes.MapHttpRoute(name: "GetApi",
                               routeTemplate: "api/{controller}/{id}",
                               defaults: new { id = RouteParameter.Optional });

    // ActionsApi - Allows for:
    // - CREATE
    // - DELETE
    // - SAVE
    // - UPDATE
    // - LIST
    // - FIND
    // - and many, many more
    RouteTable.Routes.MapHttpRoute(name: "ActionsApi",
                       routeTemplate: "api/{controller}/actions/{action}",
                       defaults: new { });

    // QueryByNameApi - Allows for:
    // - FIND: By-Name (within the URL...not the data)
    RouteTable.Routes.MapHttpRoute(name: "QueryByNameApi",
                                   routeTemplate: "api/{controller}/actions/by-name/{value}",
                                   defaults: new
                                   {
                                       value = "",
                                       action = "QueryByName"
                                   });
}

控制器:

public class SearchController : ApiController
{
    internal const string MSG_UNMANAGEDEXCEPTION = "An unexpected error occurred. Please try again.";

    // THIS WORKS !!!
    [HttpGet]
    public HttpResponseMessage Hello()
    {
        return Request.CreateResponse(HttpStatusCode.OK, "Hello back!");
    }

    // BUT...THIS FAILS ???
    [HttpPost]
    public HttpResponseMessage Find(string value)
    {
        var result = new SearchResult();

        try
        {
            var term = value.ToLowerInvariant().Trim();
            var query = Mock.Categories();

            // WHERE
            query = query.Where(x => x.Name.ToLowerInvariant().Trim().Contains(term)
                                  || x.categoryType.Name.ToLowerInvariant().Trim().Contains(term));

            // ORDER BY
            query = query.OrderBy(x => x.Name)
                         .ThenBy(x => x.categoryType.Name);

            // MATERIALIZED
            var collection = query.ToList();

            result.Filters = collection.Select(x => x.categoryType).ToList();
            result.Records = collection;
        }
        catch (Exception ex)
        {
            HttpError error = new HttpError(MSG_UNMANAGEDEXCEPTION);
            return Request.CreateResponse(HttpStatusCode.InternalServerError, error);
        }

        return Request.CreateResponse(HttpStatusCode.OK, result);
    }
}

JAVASCRIPT:
POST失败...

$.ajax({
    type: 'POST',
    data: { "value": text },
    url: 'api/search/actions/find',
    contentType: 'application/x-www-form-urlencoded; charset=UTF-8'
})

但是GET成功了吗?

$.ajax({
    type: 'GET',
    data: {},
    url: 'api/search/actions/hello',
    contentType: 'application/x-www-form-urlencoded; charset=UTF-8'
});

尝试用{action}替换routeTemplateQueryByNameApi by-name ,然后在SearchController中将[Route("api/search/actions/find/{value:string}")]属性添加到Find()方法

编辑:

如果要匹配ActionsApi尝试执行以下ajax调用:

$.ajax({
    type: 'POST',
    url: 'api/search/actions/find/' + value,
    contentType: 'application/x-www-form-urlencoded; charset=UTF-8'
})

否则,如果要匹配QueryByNameApi尝试:

 $.ajax({ type: 'POST', url: 'api/search/actions/find/' + value, contentType: 'application/x-www-form-urlencoded; charset=UTF-8' }) 

您似乎在帖子中发送json数据,但是将内容类型设置为application/x-www-form-urlencoded 我将定义一个新类来保存您的帖子值并重新定义您的帖子操作。

public class PostData
{
    public string value { get; set; }
}

控制器动作:

[HttpPost]
public HttpResponseMessage Find(PostData Data)
{
    string term = Data.value;

    //... implementation excluded
}

然后更改您的ajax调用。

$.ajax({
    type: 'POST',
    data: { "value": text },
    url: 'api/search/actions/find',
    contentType: 'application/json'
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM