一组图解释什么是HttpContext,分别是:
- 外部直接访问应用
- 外部通过Nginx或者IIS反向代理访问应用程序
![](https://img.haomeiwen.com/i16219863/c9c7193496ff45b1.png)
![](https://img.haomeiwen.com/i16219863/3efdd31600ff6296.png)
HttpContext实际上为Kestrel服务器和应用代码直接的信息桥梁,将请求信息整合在一起发送到应用代码。
示例:DotNetCore中全局使用HttpContext获取请求body。
创建一个HttpContextHelper静态类。
public static class HttpContextHelper
{
private static IHttpContextAccessor _httpContextAccessor;
public static Microsoft.AspNetCore.Http.HttpContext Current => _httpContextAccessor.HttpContext;
internal static void Configure(IHttpContextAccessor contextAccessor)
{
_httpContextAccessor = contextAccessor;
}
}
再次定义一个扩展方法配置IHttpContextAccessor。
public static class HttpContextExtentions
{
public static IApplicationBuilder UseStaticHttpContextAccessor(this IApplicationBuilder app)
{
var httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
HttpContextHelper.Configure(httpContextAccessor);
return app;
}
}
StartUp中进行引用。
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddHttpContextAccessor();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseStaticHttpContextAccessor();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "api/{controller}/{action}"
);
});
}
创建一个简单请求方法。
[Route("api/[controller]/[action]")]
[ApiController]
public class TestController : ControllerBase
{
public async Task<string> Get()
{
using (MemoryStream ms = new MemoryStream())
{
//引用HttpContext
await HttpContextHelper.Current.Request.Body.CopyToAsync(ms);
ms.Seek(0, SeekOrigin.Begin);
byte[] buffer = new byte[1024];
StringBuilder builder = new StringBuilder();
int count = 0;
while ((count=ms.Read(buffer, 0, buffer.Length)) > 0)
{
builder.Append(Encoding.UTF8.GetString(buffer));
}
return builder.ToString();
}
}
}
使用Postman请求。
![](https://img.haomeiwen.com/i16219863/03af60e4de387811.png)
网友评论