ASP.NET Core 的 HttpContex

HttpContext

HttpContext 类封装了HTTP Request 和 HTTP Response。

当收到一条HTTP Request 请求时,就会实例化一个HttpContext对象。HttpContext对象可以被中间件访问。

注意:HttpContext 不是线程安全的。

读取 HttpContext 的值

从Razer Page 读取

csharp 复制代码
public class IndexModel : PageModel
{
    public void OnGet()
    {
        var message = HttpContext.Request.PathBase;
    }
}

从Razer Page 的cshtml 读取

html 复制代码
@page
@model IndexModel
@{
    var message = HttpContext.Request.PathBase;
}

从 Controller 读取

csharp 复制代码
public class HomeController : Controller
{
    public IActionResult About()
    {
        var pathBase = HttpContext.Request.PathBase;
        return View();
    }
}

从 Minimal API 读取

csharp 复制代码
app.MapGet("/", (HttpContext context) => context.Response.WriteAsync("Hello World"));

修改 HttpContext.Request

HttpContext.Request 可以获取客户端发来的 HttpRequest 请求,并且可以修改其中的值,包括:

  • HttpRequest.Path
  • HttpRequest.Method
  • HttpRequest.Headers
  • HttpRequest.RouteValues
  • HttpRequest.Query
  • HttpRequest.ReadFormAsync()
  • HttpRequest.Body

例如下面的代码:

csharp 复制代码
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", (HttpRequest request) =>
{
    var userAgent = request.Headers.UserAgent;
    var customHeader = request.Headers["x-custom-header"];
    return Results.Ok(new { userAgent = userAgent, customHeader = customHeader });
});

app.Run();

修改 HttpContext.Response

除了能修改接收到的 HttpRequest,返回给客户端的 Response也可以修改。包括:

  • HttpResponse.StatusCode
  • HttpResponse.ContentType
  • HttpResponse.Headers
  • HttpResponse.Body

例子代码如下:

csharp 复制代码
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", (HttpResponse response) =>
{
    response.Headers.CacheControl = "no-cache";
    response.Headers["x-custom-header"] = "Custom value";
    return Results.File(File.OpenRead("helloworld.txt"));
});

app.Run();

设置 Response 尾巴

HTTP/2 和 HTTP/3 支持 Response 尾巴,可以在返回 Response 后设置Response 尾巴。

例子代码如下:

csharp 复制代码
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", (HttpResponse response) =>
{
    // Write body
    response.WriteAsync("Hello world");
    if (response.SupportsTrailers())
    {
        response.AppendTrailer("trailername", "TrailerValue");
    }
});
app.Run();

终止 HttpRequest

HttpContext.RequestAborted cancellation token 可以用于通知HttpRequest 已经被终止。

在请求时:

csharp 复制代码
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

var httpClient = new HttpClient();
app.MapPost("/books/{bookId}", async (int bookId, HttpContext context) =>
{
    var stream = await httpClient.GetStreamAsync(
        $"http://consoto/books/{bookId}.json", context.RequestAborted);
    return Results.Stream(stream, "application/json");
});
app.Run();
相关推荐
冰_河8 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
JavaGuide10 小时前
7 道 RAG 基础概念知识点/面试题总结
前端·后端
桦说编程11 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
格砸11 小时前
从入门到辞职|从ChatGPT到OpenClaw,跟上智能时代的进化
前端·人工智能·后端
蝎子莱莱爱打怪12 小时前
GitLab CI/CD + Docker Registry + K8s 部署完整实战指南
后端·docker·kubernetes
哈密瓜的眉毛美12 小时前
零基础学Java|第三篇:DOS 命令、转义字符、注释与代码规范
后端
用户605723748730813 小时前
AI 编码助手的规范驱动开发 - OpenSpec 初探
前端·后端·程序员
哈密瓜的眉毛美13 小时前
零基础学Java|第二篇:Java 核心机制与第一个程序:从 JVM 到 Hello World
后端
用户83071968408213 小时前
RabbitMQ vs RocketMQ 事务大对决:一个在“裸奔”,一个在“开挂”?
后端·rabbitmq·rocketmq