使用中间件更改 Request.Path 时,Razor 页面显示空页
Razor pages shows empty page when changing Request.Path with a middleware
我正在为子域使用中间件。中间件变化Request.Path
如下:
URL:
http://sub1.example.com
Request.Path:
/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();
}
}
编辑:
Request.Path在URL包含page时用中间件改变,路径变成如下:
URL:
http://sub1.example.com/SomePage
Request.Path:
/SubdomainPages/sub1/SomePage
/SomePage
存在但 /SubdomainPages/sub1/SomePage
不存在。这是错误的一部分。
我还添加了 app.UseStatusCodePages()
到 Startup.cs
。但是当 URL 包含子域时仍然不是 working/calling 404 页面。并且不显示 Status Code: 404; Not Found
之类的状态消息。仍然显示空白页。
我找到了解决方案。
中间件我也改了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);
}
我正在为子域使用中间件。中间件变化Request.Path
如下:
URL:
http://sub1.example.com
Request.Path:
/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();
}
}
编辑:
Request.Path在URL包含page时用中间件改变,路径变成如下:
URL:
http://sub1.example.com/SomePage
Request.Path:
/SubdomainPages/sub1/SomePage
/SomePage
存在但 /SubdomainPages/sub1/SomePage
不存在。这是错误的一部分。
我还添加了 app.UseStatusCodePages()
到 Startup.cs
。但是当 URL 包含子域时仍然不是 working/calling 404 页面。并且不显示 Status Code: 404; Not Found
之类的状态消息。仍然显示空白页。
我找到了解决方案。
中间件我也改了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);
}