ASP.NET Core MVC 从入门到精通之HttpContext
原文链接:https://www.cnblogs.com/hsiang/p/17368101.html
什么是HttpContext?
在B/S模式开发的程序中,客户端是浏览器,服务器端Web服务程序,HttpContext是连接客户端和服务器端程序的桥梁,交代了当前请求的环境信息,它封装了请求[Request]和响应[Response]及其他所有信息,示意图如下所示:
图一 内网访问程序
图二 反向代理访问程序
在示意图中,Kestrel 是一个基于 libuv 的跨平台ASP.NET Core web服务器。不清楚 Kerstrel 没关系,以后慢慢了解。
注意:HttpContext从客户端发起一个请求开始,到服务器端响应完成结束,每一个新的请求,都会创建一个新的HttpContext对象。
HttpContext属性
在HttpContext中,最常用的属性有3个【Request,Response,Session】具体属性如下表所示:
控制器中应用HttpContext
在控制器中,HttpContext作为控制器父类ControllerBase的属性存在,且Request和Response作为使用频率非常高的常用对像,控制器也声明成了属性,都可以直接使用。如下所示:
控制器外使用HttpContext
在应用程序中,控制器继承了Controller类,所以才能不用声明就可以直接使用HttpContext,但是除了控制器,还在其他的程序,那在其他程序中,如何使用HttpContext呢?
首先有一个服务接口IStudentService和服务实现类StudentService,其他中在StudentService中访问HttpContext,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | namespace DemoCoreMVC.Services { public interface IStudentService { /// <summary> /// 保存类 /// </summary> void Save(); } } namespace DemoCoreMVC.Services { public class StudentService : IStudentService { private readonly IHttpContextAccessor contextAccessor; public StudentService(IHttpContextAccessor contextAccessor) { this .contextAccessor = contextAccessor; } public void Save() { var name = this .contextAccessor.HttpContext?.Request.Query[ "Name" ]; Console.WriteLine(name); } } } |
在控制器中,通过构造函数的方式将IStudentService注入进去,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | using DemoCoreMVC.Services; using Microsoft.AspNetCore.Mvc; namespace DemoCoreMVC.Controllers { public class StudentController : Controller { private readonly IStudentService studentService; public StudentController(IStudentService studentService) { this .studentService = studentService; } public IActionResult Save() { studentService.Save(); return Json( "成功" ); } public IActionResult Index() { return View(); } } } |
在Program.cs中,将服务添加到容器中,如下所示:
1 2 3 4 | 1 //增加一个默认的HttpContextAccessor 2 builder.Services.AddHttpContextAccessor(); 3 //增加服务 4 builder.Services.AddScoped<IStudentService, StudentService>(); |
经过以上3步,就可以实现在控制器之外的类中,访问HttpContext,测试示例,如下所示:
注意:在ASP.NET Core MVC项目中,对象的创建,优先从容器中获取,这样可以不需要考虑它的创建过程和构造参数。如:创建服务Service,控制器对象Controller,视图对象View,数据访问层Repository等内容。对于模型对象,如视图模型,数据模型等不依赖其他对象的类型,则可以通过New进行创建。
HttpRequest
HttpRequest表示单个请求的传入端,常用的Query用于获取Get请求传递的参数,Form用于获取Post请求传递的参数,如下所示:
HttpRequest示例
在本示例中,以Request.Form为例,获取Post方式传递的参数,客户端将所有需要传递的内容包括在Form表单内容,在服务器端Action中通过Request.Form["Key"]进行获取。如下所示:
Add.cshtml视图中Form表单内容,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <form action= "~/Hello/Save" method= "post" > <div style= "margin:10px;" > <span>学号:</span> <input type= "text" name= "Id" /> </div> <div style= "margin:10px;" > <span>姓名:</span> <input type= "text" name= "Name" /> </div style= "margin:10px;" > <div style= "margin:10px;" > <span>年龄:</span> <input type= "text" name= "Age" /> </div> <div style= "margin:10px;" > <span>性别:</span> <input type= "text" name= "Sex" /> </div> <div style= "margin:10px;" > <input type= "submit" name= "submit" value= "保存" /> </div> </form> |
HelloController中Save方法,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [HttpPost] public IActionResult Save() { var id = Request.Form[ "Id" ]; var name = Request.Form[ "Name" ]; var age = Request.Form[ "Age" ]; var sex = Request.Form[ "Sex" ]; var student = new Student() { Id = string .IsNullOrEmpty(id) ? 0 : int .Parse(id), Name = name, Age = string .IsNullOrEmpty(age) ? 0 : int .Parse(age), Sex = sex }; return Json(student); } |
运行测试,在浏览器中输入网址【https://localhost:7116/Hello/add】进行测试,如下所示:
HttpRequest其它示例
HttpRequest中的其它示例,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public IActionResult Index() { Console.WriteLine($ "Request.Host:{Request.Host}" ); Console.WriteLine($ "Request.Path:{Request.Path}" ); Console.WriteLine($ "Request.Protocol:{Request.Protocol}" ); Console.WriteLine($ "Request.ContentType:{Request.ContentType}" ); Console.WriteLine($ "Request.Headers:" ); foreach ( var header in Request.Headers) { Console.WriteLine($ "{header.Key}:{header.Value}" ); } Console.WriteLine($ "Request.Cookies:" ); foreach ( var cookie in Request.Cookies) { Console.WriteLine($ "{cookie.Key}:{cookie.Value}" ); } return View(); } |
其它属性示例截图,如下所示:
意:在Request的Get请求中,默认ContentType为空,Cookies如果没有设置,也为空。
Cookie存放于客户端浏览器中,可以通过浏览器开发者模式F12下进行查看,以www.bilibili.com为例,如下所示:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2022-07-01 给三十几万条数据加序号(sqlserver与excel)
2022-07-01 .csv文件与excel文件的区别
2022-07-01 人脸数据库的特征提取