美文网首页
.NetCore中使用HttpContext

.NetCore中使用HttpContext

作者: AlexWillBeGood | 来源:发表于2020-08-28 18:31 被阅读0次

一组图解释什么是HttpContext,分别是:

  • 外部直接访问应用
  • 外部通过Nginx或者IIS反向代理访问应用程序
直接访问应用.png 通过Nginx或者IIS反向代理访问应用程序.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请求。


image.png

相关文章

网友评论

      本文标题:.NetCore中使用HttpContext

      本文链接:https://www.haomeiwen.com/subject/zjtrsktx.html