简体   繁体   中英

C# webAPI restrict route

in a webapi project's WebAPIConfig.cs, 2 routes are added

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

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

I try to create an apiController contains below functions

[HttpGet]
public string Get(int id)
{
    return "get";
}
[HttpGet]
[ActionName("ByWait")]
public string[] ByWait(int id)
{
    return "bywait";
}

I expects that requesting /api/controllername/1234 returns "get", and requesting /api/controllername/bywait/1234 returns "bywait".

However, the actual result is /api/controllername/1234 >> throw exception Multiple actions were found that match the request /api/controllername/bywait/1234 >> "by wait"

However can fix the issue? st how to restrict the function ByWait only accepts request containing action so that it only response to /api/controllername/bywait/1234 and ignore /api/controllername/1234

Or there is other better solution?

Thanks

First you can change WebApiConfig:

config.Routes.MapHttpRoute(
    name: "ActionApi",
    routeTemplate: "api/{controller}/{action}/{id}"
);

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

Then controller:

[HttpGet]
public string Get()
{
    return "get-default";
}

[HttpGet]
public string Get(int id)
{
    return "get" + id;
}

[HttpGet]
[Route("api/values/bywait/{id}")]
public string ByWait(int id)
{
    return "bywait";
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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