使用web api中的多个自定义操作路由配置

时间:2018-03-26 14:55:08

标签: c# asp.net-web-api asp.net-web-api-routing

所以我在两个不同的控制器中使用GET方法似乎不能同时工作。我的路线配置如下:

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}"
   );
}

使用此配置,第一个路由(GetGroupsFromSection)可以工作,但不能工作。如果我将它们切换为所以ReturnCountForGroup是第一个,那么那个工作但不工作。

这是方法

在GroupController中:

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

    return (IEnumerable<Group>)allGroups;
}

这是来自ActivationCode控制器的另一个:

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

GetGroupsFromSection获得200分。但ReturnCountForGroup收到此错误消息:

  

“MessageDetail”:“在控制器'ActivationCode'上找不到与请求匹配的操作。”

1 个答案:

答案 0 :(得分:0)

有一些冲突的路线需要更具体地进行路线匹配。路由添加到路由表的顺序也很重要。需要在更具体/有针对性的路线之后添加更多通用路线。

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 }
);