简体   繁体   中英

Route Config with multiple custom actions in web api

So I have GET-methods in two different controllers that does not seem to work at the same time. My route config looks like this:

public static void Register(HttpConfiguration config)
{

    // Web API configuration and services
    // Configure Web API to use only bearer token authentication.
    config.SuppressDefaultHostAuthentication();
    config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

    // Web API routes
    config.MapHttpAttributeRoutes();

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

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

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

With this config, the first route(GetGroupsFromSection) works, but not the other one. If I switch them up so the ReturnCountForGroup is first, then that one works but not the other.

This is the methods

In the GroupController:

[HttpGet]
public IEnumerable<Group> GetGroupsFromSection(int sectionId)
{
    var allGroups = groupRepository.SearchFor(s => s.SectionId == sectionId).ToList();

    return (IEnumerable<Group>)allGroups;
}

And here is the other one from the ActivationCode-controller:

[HttpGet]
public int ReturnCountForGroup(int groupIdCount)
{
    var count = dataContext.ActivationCode.Count(c => c.GroupId == groupIdCount);
    return count;
}

GetGroupsFromSection is getting a 200 ok. But the ReturnCountForGroup get this error-message:

"MessageDetail": "No action was found on the controller 'ActivationCode' that matches the request."

There are conflicting routes which need to be made more specific for a route match to be made. Also the order of how routes are added to the route table is important. More generic routes need to be added after more specific/targeted routes.

config.Routes.MapHttpRoute(
    name: "GetGroupsFromSection",
    routeTemplate: "api/Group/{action}/{sectionId}",
    defaults: new { controller = "Group" }
);

config.Routes.MapHttpRoute(
    name: "ReturnCountForGroup",
    routeTemplate: "api/ActivationCode/{action}/{groupIdCount}",
    defaults: new { controller = "ActivationCode" }
);

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

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