网站首页 网站源码
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\"";
}
}
}
上述代码定义了一个名为 HttpResponseHeaderHandel
的中间件类,用于处理 HTTP 响应的相关操作。以下是代码的主要功能和逻辑解释:
HttpResponseHeaderHandel
类实现了一个中间件,接收一个 RequestDelegate
类型的参数 next
,用于调用下一个中间件。next
参数赋值给私有字段 _next
。Invoke
方法是中间件的核心逻辑,接收一个 HttpContext
对象,表示当前的 HTTP 请求上下文。Access-Control-Expose-Headers
头,值为 *
,表示所有的 HTTP 响应头都可以被客户端访问。这通常用于 CORS(跨源资源共享)配置。/swagger
或 /swagger/index.html
,如果是,则重定向到 /scalar/v1
。这可能是为了将 Swagger UI 的请求重定向到一个特定的 API 版本。format
,设置响应的内容类型:format
为 xml
,则设置内容类型为 application/xml
。format
为 msgpack
,则设置内容类型为 application/x-msgpack
。await _next.Invoke(httpContext)
调用下一个中间件,继续处理请求。WWW-Authenticate
头,指明使用 Bearer 认证,并返回错误信息 invalid_token
。这个中间件的主要功能是:
这个中间件可以用于 ASP.NET Core 应用程序中,以增强 HTTP 响应的处理能力。