如何从RewriteContext获取控制器和动作名称

时间:2019-01-25 11:54:06

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

具有这样的重写规则:

public class MyRule : IRule
{
    public void ApplyRule(RewriteContext context)
    {
        var path = context.HttpContext.Request.Path;
        ///var controllerName = ???
    }
}

如何获取控制器和动作名称?


在Startup.cs /配置中,我有:

var rewriter = new RewriteOptions().Add(new MyRule());

app.UseRewriter(rewriter);

app.UseStaticFiles();

app.UseMvc(
...

2 个答案:

答案 0 :(得分:2)

重写规则对控制器和操作一无所知。

现在还不了解MVC路由,这还为时过早,通常与基于为请求定义的模式重写资源有关。

  

URL重写是根据一个或多个预定义规则修改请求URL的动作。 URL重写会在资源位置及其地址之间创建一个抽象,以便位置和地址之间不会紧密链接。
  URL重写在以下几种情况下很有价值:

     
      
  • 临时或永久移动或替换服务器资源,并为这些资源维护稳定的定位器。
  •   
  • 在不同应用程序或一个应用程序的各个区域中拆分请求处理。
  •   
  • 删除,添加或重组传入请求中的URL段。
  •   
  • 为搜索引擎优化(SEO)优化公共URL。
  •   
  • 允许使用友好的公共URL来帮助访问者预测通过请求资源返回的内容。
  •   
  • 将不安全的请求重定向到安全端点。
  •   
  • 防止热链接,其中外部站点通过将资产链接到其自己的内容来在另一个站点上使用托管的静态资产。
  •   

引用URL Rewriting Middleware in ASP.NET Core

答案 1 :(得分:1)

由于context.HttpContext.GetRouteValue("controller");RewriteContext不起作用,因此,您可以从路径中获得ControllerAction的名称,如下所示:

public class MyRule : IRule
{
    public void ApplyRule(RewriteContext context)
    {
        var path = context.HttpContext.Request.Path.ToString();

        string controllerName = "";
        string actionName = "";
        if (path.Length > 1)
        {
           string[] routeStrings = path.Remove(0, 1).Split('/');
           controllerName = routeStrings[0];
           actionName = routeStrings[1];
        }
    }
}

这可能是获取控制器和动作名称的最糟糕的解决方案!