【问题标题】:Razor pages shows empty page when changing Request.Path with a middleware使用中间件更改 Request.Path 时,Razor 页面显示空白页面
【发布时间】:2019-03-05 11:20:16
【问题描述】:

我正在为子域使用中间件。中间件更改Request.Path如下:

网址:

http://sub1.example.com

请求.路径:

/SubdomainPages/sub1

这行得通。但是当 URL 包含一个页面(例如http://sub1.example.com/SomePage)时,我得到一个空白页面。当我在OnGet 处理程序中使用NotFound() 操作结果时,会发生同样的事情(我有/Pages/Errors/404.cshtml)。

当我不使用中间件时,带有NotFound() 的页面和重定向错误页面运行良好。

这是子域中间件:

public class SubdomainRoutingMiddleware
{
    private readonly RequestDelegate _next;

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

    public async Task Invoke(HttpContext context)
    {
        string[] Subdomains = new string[] { "sub1", "sub2" };
        var parts = context.Request.Host.Value.Split('.');
        if (parts.Length > 2)
        {
            if (Subdomains.Contains(parts[0]))
            {
                if (context.Request.Path.Value != "/")
                    context.Request.QueryString = context.Request.QueryString.Add("sayfa", context.Request.Path.Value.Substring(1));
                context.Request.Path = "/SubdomainPages/" + parts[0];
            }
        }

        await _next.Invoke(context);

    }
}

这是 Startup.cs 文件:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseBrowserLink();
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
        }

        app.UseStatusCodePages();

        app.UseStatusCodePagesWithReExecute("/Errors/{0}");

        app.UseStaticFiles();

        app.UseMiddleware<SubdomainRoutingMiddleware>();

        app.UseMvc();
    }
}

编辑:

当URL包含页面时,Request.Path用中间件改变,路径变成如下:

网址:

http://sub1.example.com/SomePage

请求.路径:

/SubdomainPages/sub1/SomePage

/SomePage 存在但/SubdomainPages/sub1/SomePage 不存在。这是错误的一部分。

我还将app.UseStatusCodePages() 添加到Startup.cs。但是当 URL 包含子域时仍然无法工作/调用 404 页面。并且不显示像Status Code: 404; Not Found 这样的状态消息。仍然显示空白页。

【问题讨论】:

  • 当你说“但是当 URL 包含一个页面时......”是什么意思?例如,您的意思是 URL 是http://sub1.example.com/SomePage
  • 是的,没错。

标签: asp.net-core subdomain razor-pages


【解决方案1】:

我找到了解决办法。

我还更改了中间件中的 Request.Host。现在一切都按照我的预期进行。

    public async Task Invoke(HttpContext context)
    {
        string[] Subdomains = new string[] { "sub1", "sub2" };
        var parts = context.Request.Host.Value.Split('.');
        if (parts.Length > 2)
        {
            if (Subdomains.Contains(parts[0]))
            {
                if (context.Request.Path.Value != "/")
                    context.Request.QueryString = context.Request.QueryString.Add("sayfa", context.Request.Path.Value.Substring(1));
                context.Request.Path = "/SubdomainPages/" + parts[0];
                // Change host (without subdomain)
                context.Request.Host = new HostString("example.com");
            }
        }

        await _next.Invoke(context);

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-26
    • 2020-01-14
    • 1970-01-01
    • 2013-03-03
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 2022-07-27
    相关资源
    最近更新 更多