C# ASP.Net MVC IdentityServer 3破坏了我的webapi路由

C# ASP.Net MVC IdentityServer 3破坏了我的webapi路由,c#,asp.net,asp.net-mvc,asp.net-mvc-4,asp.net-web-api,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Asp.net Web Api,因此,我目前正在一个项目上实施安全性,并遵循identityServer3指南将其添加到我的mvc5应用程序中。我完成了完整的设置,认为一切都很好,直到我意识到我的api中的路由,除非它们是非常基本的路由,/api/../ config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults:

因此,我目前正在一个项目上实施安全性,并遵循identityServer3指南将其添加到我的mvc5应用程序中。我完成了完整的设置,认为一切都很好,直到我意识到我的api中的路由,除非它们是非常基本的路由,/api/../

     config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
我使用的是默认路由,在我的api控制器的各个部分上,我放置了路由属性,以在它们超出此格式时引导它们。例如:

    [Route("api/Location/GetByAreaIncludeFileStore/{id}")]
    public IEnumerable<Location> GetLocationsByAreaIdIncludeFileStore(int id)
    {
        if (id <= 0)
        {
            return null;
        }
        IEnumerable<Location> locations = _lookupService.GetLocationsByAreaIdIncludesFileStore(id);
        return locations;
    }
所以基本上我的问题是,我该如何修复我的路线,以便获得我需要的所有信息

目前我的路线是

    api/controller
    api/controller/id
    api/controller/action
    api/controller/action/id
任何帮助都将是惊人的,谢谢!
此外,在提出这个问题之前,我浏览了许多其他帖子,并尝试了许多不同的路由和属性。

我实际上能够使用本文解决方案中描述的方法使其工作: 我昨天试过这样做,但似乎不正确,但经过一点努力,我终于找到了正确的路线。他们建议按如下方式进行路由配置:

config.Routes.MapHttpRoute(
    name : "DefaultAPi",
    routeTemplate : "api/{controller}/{id}/{action}",
    defaults: new {id= RouteParameter.Optional, 
    action = "DefaultAction"
);
然后按照这种模式改变所有基本路线,如:

[ActionName("DefaultAction")
public string Get()
{
}

[ActionName("SpaceTypes")]
public string GetSpaceTypes(int id)
{
}

它成功了,我不得不重构我所有的api调用和restful服务来匹配,但尽管如此,我还是恢复了功能。

在WebApiConfig
config.maphttpAttribute路由()中添加这一行
config.Routes.MapHttpRoute()之前

例如,如果我进行api调用/api/area/2,api应该返回area 2的信息,但现在我得到响应:“ExceptionMessage”:“找到多个与请求匹配的操作:\r\n类型XXXXXX.Api.Controllers.AreaController上的默认操作\r\n类型XXXXXXX.Api.Controllers.AreaController上的两个文件存储区类型XXXXXXX.Api.Controllers.AreaController\r\n类型XXXXXXX.Api.Controllers.AreaController上的NgatareasByTourid“,因此包含操作的routes标记未被识别。我现在看到了。我认为您需要在默认路由上定义一个操作…config.routes.maphttroute(名称:“DefaultApi”,routeTemplate:“api/{controller}/{action}/{id}”,默认值:new{controller=“myController”,操作=“MyAction”,id=RouteParameter.Optional});如果我做了这样的更改,它将导致webapi,尝试使用(使用示例/api/area/2)2作为操作,而响应正好是:“Message:“未找到与请求URI匹配的HTTP资源”。,“MessageDetail:”在控制器'Area'上找不到与名称'2'匹配的操作。“用[Route(“”)装饰区域控制器中的索引方法,该方法应将调用路由到索引方法,而不向索引方法发送操作。我已经这样做了,我刚刚发布了路由片段,如果该部分不清楚,很抱歉。我发布的解决方案修复了它。
[ActionName("DefaultAction")
public string Get()
{
}

[ActionName("SpaceTypes")]
public string GetSpaceTypes(int id)
{
}