【问题标题】:Route Config with multiple custom actions in web api在 web api 中具有多个自定义操作的路由配置
【发布时间】:2018-09-04 18:37:10
【问题描述】:

所以我在两个不同的控制器中有 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’上找不到与请求匹配的操作。”

【问题讨论】:

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


    【解决方案1】:

    有冲突的路线需要更具体才能进行路线匹配。此外,如何将路由添加到路由表的顺序也很重要。在更具体/有针对性的路线之后,需要添加更通用的路线。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-10
      • 2019-11-22
      相关资源
      最近更新 更多