【问题标题】:The easiest way to get an instance of IRouter outside of controller class在控制器类之外获取 IRouter 实例的最简单方法
【发布时间】:2016-10-28 18:33:06
【问题描述】:

我有一个使用 Mvc 和 OpenID Connect Auth 的 ASP.NET Core 应用程序。

在 OpenID 事件处理程序中,我想处理用户在身份验证服务器上拒绝同意屏幕的情况,并且我想将用户重定向到特定页面,使用路由器生成重定向 URL。我只是不喜欢硬编码的 URL。

因此,我必须实现自定义 UseMvc 方法,该方法通过 out 参数将 IRouter 返回给调用方法。然后我可以将它保存到 Startup 方法的属性中,并在其中的每个方法中使用。

问题是我的解决方案对我来说似乎不正确,就像应该有一种更简单的方法来完成我想要的。只是好奇是否有人能指出我正确的方向。

我的代码是here。我提到的自定义方法是here。并将其称为there,以便解析的路由器可以进一步使用here

【问题讨论】:

  • 您是否有任何特殊原因想要获取IRouter,或者您可以获取IUrlHelper 并使用那里的实用方法生成网址?

标签: c# asp.net asp.net-core-mvc


【解决方案1】:

只要您的代码在路由中间件(由UseMvc() 添加)之后运行,您就可以访问路由器。因此,您可能添加的在 MVC 之前运行的任何自定义中间件都将无法访问路由。

基本上任何类型的 MVC 结构,如控制器、过滤器、标签助手等,都可以访问路由器,如以下任何一种:

var routers = httpContext.GetRouteData().Routers;
var routers httpContext.Features.Get<IRoutingFeature>().RouteData.Routers;

但是,如果您的代码已经是 MVC 构造,那么您最好使用 IUrlHelper 使用它的任何方法生成 url,例如:

urlHelper.Action("Index", "Home");

IUrlHeleper 可以在多个地方轻松获得(例如Controller 派生类中的Url 属性),但您也可以使用this question 中的DI 来获取它。 (只要您使用 DI 解析的代码在路由中间件之后运行!)

【讨论】:

  • 好点,但在我的情况下不起作用。问题是我需要在 Mvc 之前放置 OpenID Connect 代码(以及任何其他身份验证),否则它将无法正常工作。
猜你喜欢
  • 1970-01-01
  • 2015-09-14
  • 2012-10-27
  • 1970-01-01
  • 1970-01-01
  • 2013-11-20
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
相关资源
最近更新 更多