Asp.net核心url从中间件重写不起作用

时间:2017-03-31 03:09:41

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

我有一个dot net core web应用程序,带有一些mvc控制器和一个有角度的2应用程序。我正在尝试重写请求路径,例如" www.example.com/old/path"到" www.example.com/new/path"然后将其发送到angular 2 app(其路由设置仅适用于" new / path")。但是,尽管重写似乎已经奏效(从断点判断),但Angular仍然保持着老路。我怀疑这可能反映了我对中间件执行顺序的理解上的某种差距(但我尝试过不同的命令并且在任何地方发送重写代码都无用)。

这是url重写中间件的样子(UrlRewritingMiddleware.cs):

public sealed class UrlRewritingMiddleware
{
    private readonly RequestDelegate _next;

    private readonly string OldPathSegment= "/old/path/";
    private readonly string NewPathSegment= "/new/path/";

    public UrlRewritingMiddleware(RequestDelegate next)
    {
      this._next = next;
    }

    private void RewriteUrl(HttpContext context)
    {
      if (context.Request.Path.Value.IndexOf(OldPathSegment, 0, StringComparison.CurrentCultureIgnoreCase) != -1)
      {
        context.Request.Path = new PathString(Regex.Replace(context.Request.Path.Value, OldPathSegment, NewPathSegment, RegexOptions.IgnoreCase));
      }
    }
    public async Task Invoke(HttpContext context)
    {
      RewriteUrl(context);
      await _next.Invoke(context);
      if (context.Response.StatusCode == 404 && !Path.HasExtension(context.Request.Path.Value))
      {
        context.Request.Path = "/app/root/index.html";
        context.Response.StatusCode = 200;
        await _next.Invoke(context);
        RewritePathsInContext(context);//spam
      }
      else
      {
        //spam
        RewritePathsInContext(context);
      }         
    }
}

然后这就是Startup.cs Configure方法的样子:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    //putting in the beginning, I get error in angular
    //EXCEPTION: Uncaught (in promise): Error: Cannot match any routes. URL Segment: '/old/path'
    app.UseUrlRewritingMiddleware();
    app.AnotherCustomMiddleware();//I can see Path changed to new/path inside here
    app.UseDefaultFiles();
    app.UseMvc();
    app.UseStaticFiles();
    //putting this at the end gives me 404 in asp.net
    //app.UseUrlRewritingMiddleware();        
}

1 个答案:

答案 0 :(得分:2)

经过一夜安眠之后,我意识到服务器端重写请求路径不会改变浏览器中显示的URL(这是角度得到的)。因此,www.example.com/old/path将在浏览器中保持不变,只有重定向可以将其更改为www.example.com/new/path(这不是我想要的)。要解决这个问题,我必须在角度应用程序本身中添加重定向。我的角度应用程序也调用了一些mvc控制器/视图,但它们始终采用/ new / path格式,所以此时我不需要服务器端重写。

另外,关于中间件的顺序,我怀疑将它放在最后的原因给我在asp.net中的404可能是因为它来自UseMvc中间件(已经设置了路由?)。 Haven没有对它进行过测试,但只要它出现在UseMvc中间件之前,我认为它应该可行。 编辑:请参阅下面的ssmith评论。 UseMvc是一个终端中间件,所以在它之后的任何事情都无法工作。

如果你确实需要服务器端网址重写,asp.net核心有re-writing middleware你可以使用,而且实际上不需要自己编写:

var options = new RewriteOptions()
                 .AddRewrite(@"/old/path/", "/new/path/", skipRemainingRules: true);
app.UseRewriter(options);