zl程序教程

您现在的位置是:首页 >  系统

当前栏目

【愚公系列】2023年02月 WMS智能仓储系统-003.HttpContext的使用

系统智能 使用 系列 2023 02 愚公 仓储
2023-06-13 09:17:28 时间

文章目录


前言

网页和webapi程序交互是通过 HttpContext 传导,HttpContext包含了Cookie、Seesion、提交表单、上传数据、身份认证等信息。

HttpContext 对象主要包含以下信息:

  • Request 用于获取用户请求的对象,浏览器向Web程序提交表单、访问的URL、URL中包含的查询字符串、报文请求头等等。
  • Body 获取或设置 RequestBody 流
  • ContentLength 获取或设置 Content-Length 头
  • ContentType 获取或设置Content-Type 头
  • Cookies 获取或设置 Cookies
  • Form 获取或设置 表单内容
  • HasFormContentType Checks the Content-Type header for form types.
  • Headers Gets the request headers.
  • Host 获取或设置主机头。可以包括端口
  • HttpContext 获取或设置请求上下文
  • IsHttps 检测当前是否HTTPS连接
  • Method 获取或设置HTTP方法
  • Path 获取或设置当前请求的路径,即URL
  • PathBase 获取或设置 RequestPathBase,就是URL前面那一段,如https://docs.microsoft.com
  • Protocol Gets or sets the RequestProtocol.
  • Query 查询字符串的集合
  • QueryString 获取或设置用于在Request.Query中创建查询集合的原始查询字符串
  • Scheme 获取或设置HTTP请求方案

在.NET Core中访问HttpContext需要进行注入,.NET Core中内置了IHttpContextAccessor接口,HttpContextAccessor默认实现了它简化了访问HttpContext。它必须在程序启动时在IServicesCollection中注册,这样在程序中就能获取到HttpContextAccessor,并用来访问HttpContext。

一、HttpContext的使用

1.注入

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

2.控制器中使用

/// <summary>
/// asn controller
/// </summary>
[Route("Home")]
[ApiController]
[ApiExplorerSettings(GroupName = "Base")]
public class HomeController : BaseController
{
    private IHttpContextAccessor _accessor;
    public HomeController(IHttpContextAccessor accessor)
    {
        _accessor = accessor;
    }

    [HttpGet]
    public async Task<IActionResult> GetAsync()
    {
        var httpcontext = _accessor.HttpContext;
        return Ok();
    }
}

3.运行

二、Session和Cookies的封装

1.封装类

public interface ISessionHelper
{
    void Set(string key, string value);
    void Get(string key);
    void SetObjectAsJson(string key, object value);
}
public class SessionHelper : ISessionHelper
{
    //使用构造函数注入IHttpContextAccessor 
    private readonly IHttpContextAccessor _httpContextAccessor;
    /// <summary>
    /// 声明session接收
    /// </summary>
    private ISession _session => _httpContextAccessor.HttpContext.Session;
    /// <summary>
    /// 声明Cookies接收
    /// </summary>
    private IResponseCookies responseCookies => _httpContextAccessor.HttpContext.Response.Cookies;

    public SessionHelper(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public void Set(string key, string value)
    {
        //这里的方法只是上面简化版下面用
        //_httpContextAccessor.HttpContext.Session.SetString(key, value);
        // _httpContextAccessor.HttpContext.Response.Cookies.Append(key, value);

        //session存值
        _session.SetString(key, value);
        //Cookies存值
        responseCookies.Append(key, value);
    }

    public void Get(string key)
    {
        string code = _session.GetString(key);
    }
    public void SetObjectAsJson(string key, object value)
    {
        _session.SetString(key, JsonConvert.SerializeObject(value));
    }
}

2.注入

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
//这里只是为了在homecontroller中使用依赖注入 接口实现方法内容
services.AddSingleton<ISessionHelper, SessionHelper>();

3.使用

/// <summary>
/// asn controller
/// </summary>
[Route("Home")]
[ApiController]
[ApiExplorerSettings(GroupName = "Base")]
public class HomeController : BaseController
{
    private readonly ISessionHelper Ihelper;
    public HomeController(ISessionHelper SessionHelper)
    {
        Ihelper = SessionHelper;
    }

    [HttpGet]
    public async Task<IActionResult> GetAsync()
    {
        Ihelper.Set("my_session", "我是session实例");

        var my_session = HttpContext.Session.GetString("my_session");

        return Ok();
    }
}