【发布时间】:2015-08-05 13:24:58
【问题描述】:
因此,我目前正在为我正在从事的项目实施安全性,并按照 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;
}
正如我之前所说,在添加身份服务器之前,论文工作得很好。在添加 IdentityServer 期间,我必须向我的 webapi 添加一些 nuget 包:
install-package Microsoft.Owin.Host.SystemWeb
install-package Microsoft.Aspnet.WebApi.Owin
install-package Thinktecture.IdentityServer3.AccessTokenValidation
所以基本上我的问题毕竟是,我怎样才能修复我的路线,以便我可以获得我需要的所有信息?
目前我的路线是
api/controller
api/controller/id
api/controller/action
api/controller/action/id
任何帮助都会很棒,谢谢! 另外,在问这个问题之前,我浏览了许多其他帖子并尝试了很多路由和属性的变体。
【问题讨论】:
-
例如,如果我进行 api 调用 /api/area/2 api 应该返回区域 2 的信息,但现在我得到响应:“ExceptionMessage”:“找到与请求匹配的多个操作: \r\nDefaultAction on type XXXXXX.Api.Controllers.AreaController\r\nGetWithFileStores on type XXXXXXX.Api.Controllers.AreaController\r\nGetAreasByTourId on type XXXXXXX.Api.Controllers.AreaController",因此具有操作的路由标记是'未被识别
-
对不起,我现在看到了..
-
我相信你需要在你的默认路由上定义一个动作...config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{ id}",默认值:new { controller = "myController", action = "MyAction", id = RouteParameter.Optional });
-
如果我进行该更改会导致 webapi,尝试使用(使用示例 /api/area/2 ) 2 作为操作,并且响应正是:“消息”:“没有 HTTP找到与请求 URI 'localhost:44302/api/Area/2''匹配的资源。", "MessageDetail": "在控制器 'Area' 上找不到与名称 '2' 匹配的操作。"
-
用 [Route("")] 装饰区域控制器中的 Index 方法,该方法应该将没有操作的调用路由到 index 方法。
标签: c# asp.net asp.net-mvc asp.net-mvc-4 asp.net-web-api