C# .NET8 Web 应用程序:如何将“坏”URL 路由到主页?

问题描述 投票:0回答:1

我们已弃用用 VB.NET 编写的旧 ASP.NET 网站。取而代之的是,我们在 .NET 8 上用 C# 编写了一个简单的“横幅页面”。

新应用程序有

  1. 主页,以及
  2. 用于添加、更新和删除“功能请求”的页面。

它是用 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 重定向?

c# asp.net-core routes .net-8.0
1个回答
0
投票

我通过让中间件检查“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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.