【问题标题】:ASP.Net MVC IdentityServer3 broke my webapi routingASP.Net MVC IdentityServer3 破坏了我的 webapi 路由
【发布时间】: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


【解决方案1】:

在您的 WebApiConfig config.MapHttpAttributeRoutes(); 中将此行添加到您的 config.Routes.MapHttpRoute() 之前。

【讨论】:

  • 我已经有了,我刚刚发布了路由 sn-p,如果那部分不清楚,请见谅。我发布的解决方案就是修复它。
【解决方案2】:

我实际上能够使用本文解决方案中描述的方法使其工作:MVC 4.5 Web API Routing not working? 我昨天尝试这样做,但它似乎不正确,但经过更多的吐槽和润色,我最终获得了正确的路线。他们建议将路由配置如下:

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 服务以匹配,但尽管如此,我恢复了正常运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 2017-02-24
    • 2017-06-26
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    相关资源
    最近更新 更多