简体   繁体   English

ASP.Net MVC:如何在 ASP.NET Core 中通过中间件重写 url

[英]ASP.Net MVC:How to rewrite url by middleware in ASP.NET Core

In asp.net 4.0 we can use work with the http module to rewrite module like so:在 asp.net 4.0 中,我们可以使用 http 模块来重写模块,如下所示:

protected void Application_BeginRequest(Object sender, EventArgs e)
{
    string CountryCodeInUrl = "", redirectUrl="";
    var countryCode = CookieSettings.ReadCookie();
    if (countryCode=="")
    {
        countryCode = "gb";
    }

    if (HttpContext.Current.Request.RawUrl.Length >= 2)
    {
        CountryCodeInUrl = HttpContext.Current.Request.RawUrl.Substring(1, 2);
    }

    if (countryCode != CountryCodeInUrl)
    {
        if (HttpContext.Current.Request.RawUrl.Length >= 2)
        {
            if (HttpContext.Current.Request.RawUrl.Substring(1, 2) != "")
            {
                countryCode = HttpContext.Current.Request.RawUrl.Substring(1, 2);
            }
        }
        if(!System.Web.HttpContext.Current.Request.RawUrl.Contains(countryCode))
        {
            redirectUrl = string.Format("/{0}{1}", countryCode, System.Web.HttpContext.Current.Request.RawUrl);
        }
        else
        {
            redirectUrl = System.Web.HttpContext.Current.Request.RawUrl;
        }
        CookieSettings.SaveCookie(countryCode);
        System.Web.HttpContext.Current.Response.RedirectPermanent(redirectUrl);
    }   
}

How could I rewrite the code above using middleware in ASP.NET Core?如何使用 ASP.NET Core 中的中间件重写上面的代码?

I have just partially read this article: https://docs.microsoft.com/en-us/aspnet/core/migration/http-modules我刚刚部分阅读了这篇文章: https : //docs.microsoft.com/en-us/aspnet/core/migration/http-modules

You pretty much just need to move the code to a middleware class, and use the Core HttpContext instead of the System.Web one.您几乎只需要将代码移动到中间件类,并使用 Core HttpContext 而不是 System.Web 。

A class like that would look like this:这样的类看起来像这样:

//RedirectMiddleware.cs //重定向中间件.cs

public class RedirectMiddleware
{
    private readonly RequestDelegate _next;

    public RedirectMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        string CountryCodeInUrl = "", redirectUrl = "";
        var countryCode = CookieSettings.ReadCookie();
        if (countryCode == "")
        {
            countryCode = "gb";
        }

        if (context.Request.Path.Value.Length >= 2)
        {
            CountryCodeInUrl = context.Request.Path.Value.Substring(1, 2);
        }

        if (countryCode != CountryCodeInUrl)
        {
            if (context.Request.Path.Value.Length >= 2)
            {
                if (context.Request.Path.Value.Substring(1, 2) != "")
                {
                    countryCode = context.Request.Path.Value.Substring(1, 2);
                }
            }
            if (!context.Request.Path.Value.Contains(countryCode))
            {
                redirectUrl = string.Format("/{0}{1}", countryCode, context.Request.Path.Value);
            }
            else
            {
                redirectUrl = context.Request.Path.Value;
            }
            CookieSettings.SaveCookie(countryCode);
            context.Response.Redirect(redirectUrl, true);
        }

        await _next.Invoke(context);
    }
}

To use it you then register it in you Startup.cs file, before you register the MVC middleware, like this:要使用它,请在注册 MVC 中间件之前在 Startup.cs 文件中注册它,如下所示:

app.UseMiddleware<RedirectMiddleware>();

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});

I hope this'll get you started, you can see this blog post for more information on middleware.我希望这能让您入门,您可以查看博客文章以获取有关中间件的更多信息。

As long as you insert the rewrite middleware before other middleware that fires you can re-write the Context.Request.Path in the middleware code.只要您在触发的其他中间件之前插入重写中间件,您就可以在中间件代码中重写Context.Request.Path

The Path is writable and any subsequent code/middleware will use the new path to process the request.该路径是可写的,任何后续代码/中间件都将使用新路径来处理请求。

Using self-contained (app.Use()) middleware you can do:使用自包含 (app.Use()) 中间件,您可以执行以下操作:

app.Use(async (context,next) =>
{
    var url = context.Request.Path.Value;

    // Rewrite privacy URL to index
    if (url.Contains("/home/privacy"))
    {
        // rewrite to index
        context.Request.Path = "/home/index";
    }

    await next();
});

Unlike the Repsonse.Redirect() (which fires a new server request) the URL of the original request is not changed by this operation.Repsonse.Redirect() (触发新的服务器请求)不同,此操​​作不会更改原始请求的 URL。

More info in this blog post:这篇博文中的更多信息:

Back to Basics: URL Rewriting in ASP.NET Core 回归基础:在 ASP.NET Core 中重写 URL

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM