zoukankan      html  css  js  c++  java
  • Multiple actions were found that match the request in Web Api

    https://stackoverflow.com/questions/14534167/multiple-actions-were-found-that-match-the-request-in-web-api

    Answer1

    Your route map is probably something like this:

    routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional });

    But in order to have multiple actions with the same http method you need to provide webapi with more information via the route like so:

    routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional });

    Notice that the routeTemplate now includes an action. Lots more info here: http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

    Update:

    Alright, now that I think I understand what you are after here is another take at this:

    Perhaps you don't need the action url parameter and should describe the contents that you are after in another way. Since you are saying that the methods are returning data from the same entity then just let the parameters do the describing for you.

    For example your two methods could be turned into:

    public HttpResponseMessage Get()
    {
        return null;
    }
    
    public HttpResponseMessage Get(MyVm vm)
    {
        return null;
    }

    What kind of data are you passing in the MyVm object? If you are able to just pass variables through the URI, I would suggest going that route. Otherwise, you'll need to send the object in the body of the request and that isn't very HTTP of you when doing a GET (it works though, just use [FromBody] infront of MyVm).

    Hopefully this illustrates that you can have multiple GET methods in a single controller without using the action name or even the [HttpGet] attribute.

    Answer2

    Update as of Web API 2.

    With this API config in your WebApiConfig.cs file:

    public static void Register(HttpConfiguration config)
    {
        //// Web API routes
        config.MapHttpAttributeRoutes(); //Don't miss this
    
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = System.Web.Http.RouteParameter.Optional }
        );
    }

    You can route our controller like this:

    [Route("api/ControllerName/Summary")]
    [HttpGet]
    public HttpResponseMessage Summary(MyVm vm)
    {
        rturn null;
    }
    
    [Route("api/ControllerName/FullDetails")]
    [HttpGet]
    public HttpResponseMessage FullDetails()
    {
        return null;
    }

    Where ControllerName is the name of your controller (without "controller"). This will allow you to get each action with the route detailed above.

    For further reading: http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

     Answer3

    After a lot of searching the web and trying to find the most suitable form for routing map if have found the following

    config.Routes.MapHttpRoute("DefaultApiWithId", "Api/{controller}/{id}", new { id =RouteParameter.Optional }, new { id = @"d+" });
    config.Routes.MapHttpRoute("DefaultApiWithAction", "Api/{controller}/{action}");

    These mapping applying to both action name mapping and basic http convention (GET,POST,PUT,DELETE) 

    For me this worked, but only after changing the order of routes in the route configuration so that the one with action appeared first

    https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api

     https://www.cnblogs.com/chucklu/p/10283664.html

    目前的修改方案是,添加了action

    config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
    );

    这样会导致的问题是,之前可以工作的,现在不工作了

    request1 404错误

    GET http://localhost/Chuck_WebApi/api/products HTTP/1.1
    User-Agent: Fiddler
    Host: localhost
    Content-Length: 0

    request2  404错误

    GET http://localhost/Chuck_WebApi/api/product/1 HTTP/1.1
    User-Agent: Fiddler
    Host: localhost
    Content-Length: 0

    request1需要修改为

    GET http://localhost/Chuck_WebApi/api/products/getallproducts HTTP/1.1
    User-Agent: Fiddler
    Host: localhost
    Content-Length: 0

    request2需要修改为

    GET http://localhost/Chuck_WebApi/api/products/getproduct/1 HTTP/1.1
    User-Agent: Fiddler
    Host: localhost
    Content-Length: 0

  • 相关阅读:
    请教JDBC中的thin和OCI的区别
    ORACLE中查询被锁定的表,以及如何解锁
    oracle批量插入测试数据
    oracle查看用户表
    decode 函数及其用法
    oracle序列详解
    MySQL数据库远程连接开启方法
    CentOS下MySQL忘记root密码解决方法【转载】
    oracle实现同时多表插入
    MyCat:第七章:MyCAT的亿级别任务
  • 原文地址:https://www.cnblogs.com/chucklu/p/10283802.html
Copyright © 2011-2022 走看看