网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
using Microsoft.Extensions.Primitives;

namespace Dpz.Core.WebApi.Middleware;

/// <summary>
/// 处理HTTP响应中间件
/// </summary>
public class HttpResponseHeaderHandel
{
    private readonly RequestDelegate _next;

    /// <summary>
    ///
    /// </summary>
    /// <param name="next"></param>
    public HttpResponseHeaderHandel(RequestDelegate next)
    {
        _next = next;
    }

    /// <summary>
    ///
    /// </summary>
    /// <param name="httpContext"></param>
    /// <returns></returns>
    public async Task Invoke(HttpContext httpContext)
    {
        /*
         * from https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers
         * 列出哪些 http response headers 对外暴露
         * 这里设置为所有
         */
        httpContext.Response.Headers.Append("Access-Control-Expose-Headers", "*");
        if (
            httpContext.Request.Path.Equals("/swagger", StringComparison.OrdinalIgnoreCase)
            || httpContext.Request.Path.Equals(
                "/swagger/index.html",
                StringComparison.OrdinalIgnoreCase
            )
        )
        {
            httpContext.Response.Redirect("/scalar/v1", true);
            return;
        }

        if (
            string.Equals(
                httpContext.Request.Query["format"],
                "xml",
                StringComparison.OrdinalIgnoreCase
            )
        )
        {
            httpContext.Response.ContentType = "application/xml";
        }
        if (
            string.Equals(
                httpContext.Request.Query["format"],
                "msgpack",
                StringComparison.OrdinalIgnoreCase
            )
        )
        {
            httpContext.Response.ContentType = "application/x-msgpack";
        }

        await _next.Invoke(httpContext);

        if (httpContext.Response.StatusCode == 401)
        {
            httpContext.Response.Headers.WWWAuthenticate =
                "Bearer realm=\"api\" error=\"invalid_token\"";
        }
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

上述代码定义了一个名为 HttpResponseHeaderHandel 的中间件类,用于处理 HTTP 响应的相关操作。以下是代码的主要功能和逻辑解释:

1. 类的定义和构造函数

  • HttpResponseHeaderHandel 类实现了一个中间件,接收一个 RequestDelegate 类型的参数 next,用于调用下一个中间件。
  • 构造函数将传入的 next 参数赋值给私有字段 _next

2. Invoke 方法

  • Invoke 方法是中间件的核心逻辑,接收一个 HttpContext 对象,表示当前的 HTTP 请求上下文。

3. 设置响应头

  • 在响应中添加 Access-Control-Expose-Headers 头,值为 *,表示所有的 HTTP 响应头都可以被客户端访问。这通常用于 CORS(跨源资源共享)配置。

4. 路由重定向

  • 检查请求的路径是否为 /swagger/swagger/index.html,如果是,则重定向到 /scalar/v1。这可能是为了将 Swagger UI 的请求重定向到一个特定的 API 版本。

5. 设置内容类型

  • 根据请求的查询参数 format,设置响应的内容类型:
    • 如果 formatxml,则设置内容类型为 application/xml
    • 如果 formatmsgpack,则设置内容类型为 application/x-msgpack

6. 调用下一个中间件

  • 使用 await _next.Invoke(httpContext) 调用下一个中间件,继续处理请求。

7. 处理 401 状态码

  • 在响应完成后,检查响应的状态码是否为 401(未授权)。如果是,则在响应头中添加 WWW-Authenticate 头,指明使用 Bearer 认证,并返回错误信息 invalid_token

总结

这个中间件的主要功能是:

  • 设置 CORS 响应头以允许客户端访问所有响应头。
  • 根据请求路径进行重定向。
  • 根据查询参数设置响应的内容类型。
  • 在处理完请求后,针对未授权的响应添加认证信息。

这个中间件可以用于 ASP.NET Core 应用程序中,以增强 HTTP 响应的处理能力。

loading