我们已弃用用 VB.NET 编写的旧 ASP.NET 网站。取而代之的是,我们在 .NET 8 上用 C# 编写了一个简单的“横幅页面”。
新应用程序有
它是用 C# 编写的,使用 .NET 8。它托管在 IIS/Windows Server 2019 上。
原始应用程序有许多不同的 URL。我想确保用户始终被定向到新的“主”页面,无论他们尝试使用什么“旧”URL。
我本来希望使用IIS“配置错误”;但这似乎不起作用(我尝试了很多变体)。
因此,我编写了一个中间件组件来在 HTTP 404 上重定向。它似乎有效(我成功地重定向到主页,无论 URL 是什么)。但我收到这个错误:
执行请求时发生未处理的异常。 System.InvalidOperationException:无法修改响应标头,因为响应已经开始。
代码 -
RedirectPageNotFound.cs
:
public class RedirectPageNotFound
{
private readonly RequestDelegate _next;
private readonly ILogger<RedirectPageNotFound> _logger;
public RedirectPageNotFound(RequestDelegate next, ILogger<RedirectPageNotFound> logger)
{
_next = next;
_logger = logger;
}
public async Task Invoke(HttpContext context)
{
await _next(context);
if (context.Response.StatusCode == 404)
{
_logger.LogInformation($"Handling 404 error for request {context.Request.Path}");
context.Response.Redirect("/");
}
else
{
await _next(context);
}
}
}
Program.cs
:
app.MapRazorPages();
app.MapControllers();
app.UseMiddleware<RedirectPageNotFound>();
问题1:如何修复
System.InvalidOperationException
?
Q2:有没有一种“更好”的方法将“坏 URL”重新路由到我的“主页”,这样它就根本不执行 HTTP 重定向?
我通过让中间件检查“context.EndPoint == null”而不是“context.Response.StatusCode == 404”解决了这个问题:
public async Task Invoke(HttpContext context)
{
if (context.GetEndpoint() == null)
{
string msg = string.Format("{0}\t{1}\t{2}",
DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
context.User.Identity.Name,
context.Request.Path);
using (FileStream fs = File.Open("user404.txt", FileMode.OpenOrCreate))
{
fs.Seek(0, SeekOrigin.End);
using (StreamWriter sw = new StreamWriter(fs))
sw.WriteLine(msg);
}
context.Response.Redirect("/");
}
else
{
await _next(context);
}
}