最新要闻
- AMD RX 7000全家倾巢出动 卡皇现世!苏姿丰:敬请期待
- 热心大哥高铁怒斥熊孩子家长获喝彩:掌声响起-世界最新
- 各地陆续迎来假期返程高峰
- 热推荐:汽油价格还要再大降?国际油价已跌超5%
- 全球今头条!徐州市人力和社会资源保障局网站_徐州市人力资源和社会保障网
- 最新:马斯克的星舰首飞:到底是成功了?还是失败了?
- 五一返程高峰遇强降雨 多地堵上加堵:局部140毫米大暴雨-热消息
- 天文专家回应哈尔滨现不明飞行物:可能是卫星残骸 没必要恐慌 每日资讯
- dotnetfx35无法安装_dotnetfx35
- 游客手机掉西湖被要1500元打捞费 景区:简单打捞不收费-全球观察
- 员工朋友圈未发广告被罚1万且开除:法院判赔5万 当前短讯
- 印度捷行航空申请破产 原因想不到:普惠发动机故障太多-视点
- 【e公司观察】原料涨价 锂电行业为何振奋不已?|当前看点
- 四川自贡一餐厅吃饭收15元空调费 店家:相当于雅间费-全球今头条
- 各主要高速公路、国省道干线交通总体安全顺畅 最新消息
- 有钱人为何在意电动车电费?李想用超级富豪朋友习惯解释原因-全球讯息
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
ASP.NET Core MVC 从入门到精通之HttpContext
随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NET Core MVC 系统开发的人员。 经过前几篇文章的讲解,初步了解ASP.NET Core MVC项目创建,启动运行,以及命名约定,创建控制器,视图,模型,接收参数,传递数据,路由,页面布局,wwwroot和客户端库,Razor语法,EnityFrameworkCore与数据库等内容,今天继续讲解ASP.NET Core MVC 中HttpContext等相关内容,仅供学习分享使用。
什么是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 namespace DemoCoreMVC.Services 2 { 3 public interface IStudentService 4 { 5 ///6 /// 保存类 7 /// 8 void Save(); 9 }10 }11 12 namespace DemoCoreMVC.Services13 {14 public class StudentService : IStudentService15 {16 private readonly IHttpContextAccessor contextAccessor;17 18 public StudentService(IHttpContextAccessor contextAccessor)19 {20 this.contextAccessor = contextAccessor;21 }22 23 public void Save()24 {25 var name = this.contextAccessor.HttpContext?.Request.Query["Name"];26 Console.WriteLine(name);27 }28 }29 }
在控制器中,通过构造函数的方式将IStudentService注入进去,如下所示:
1 using DemoCoreMVC.Services; 2 using Microsoft.AspNetCore.Mvc; 3 4 namespace DemoCoreMVC.Controllers 5 { 6 public class StudentController : Controller 7 { 8 private readonly IStudentService studentService; 9 10 public StudentController(IStudentService studentService)11 {12 this.studentService = studentService;13 }14 15 public IActionResult Save()16 {17 studentService.Save();18 return Json("成功");19 }20 21 public IActionResult Index()22 {23 return View();24 }25 }26 }
在Program.cs中,将服务添加到容器中,如下所示:
1 //增加一个默认的HttpContextAccessor2 builder.Services.AddHttpContextAccessor();3 //增加服务4 builder.Services.AddScoped();
经过以上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
HelloController中Save方法,如下所示:
1 [HttpPost] 2 public IActionResult Save() 3 { 4 5 var id = Request.Form["Id"]; 6 var name = Request.Form["Name"]; 7 var age = Request.Form["Age"]; 8 var sex = Request.Form["Sex"]; 9 var student = new Student()10 {11 Id = string.IsNullOrEmpty(id) ? 0 : int.Parse(id),12 Name = name,13 Age = string.IsNullOrEmpty(age) ? 0 : int.Parse(age),14 Sex = sex15 };16 return Json(student);17 }
运行测试,在浏览器中输入网址【https://localhost:7116/Hello/add】进行测试,如下所示:
HttpRequest其它示例
HttpRequest中的其它示例,如下所示:
1 public IActionResult Index() 2 { 3 Console.WriteLine($"Request.Host:{Request.Host}" ); 4 Console.WriteLine($"Request.Path:{Request.Path}"); 5 Console.WriteLine($"Request.Protocol:{Request.Protocol}"); 6 Console.WriteLine($"Request.ContentType:{Request.ContentType}"); 7 Console.WriteLine($"Request.Headers:"); 8 foreach(var header in Request.Headers) 9 {10 Console.WriteLine($"{header.Key}:{header.Value}");11 }12 Console.WriteLine($"Request.Cookies:");13 foreach (var cookie in Request.Cookies)14 {15 Console.WriteLine($"{cookie.Key}:{cookie.Value}");16 }17 return View();18 }
其它属性示例截图,如下所示:
注意:在Request的Get请求中,默认ContentType为空,Cookies如果没有设置,也为空。
Cookie存放于客户端浏览器中,可以通过浏览器开发者模式F12下进行查看,以www.bilibili.com为例,如下所示:
HttpResponse
HttpResponse表示单个请求的传出内容,
状态码StatusCode
StatusCode是一个int类型,表示当前响应Http请求的状态,可以通过System.Net.HttpStatusCode(枚举)进行转换,常用的有以下几种:
- OK = 200,成功,这是最常用的一个响应状态码
- NotFound = 404, 未发现,即请求的信息不存在
- InternalServerError = 500,服务器内部错误
- Redirect = 302, 请求已被重定向
在Controller中,常见的状态码返回值,以被定义为方法,如:Ok(),NotFound()等,可以直接调用。
HttpResponse示例
在响应的Headers中,添加Author信息,如下所示:
1 public IActionResult Test2()2 {3 Response.Headers.Add("Author", "公子小六");4 return Json("ABC");5 }
在添加Headers时,如果是汉字,则会报下面一个错误,如下所示:
以上错误表示编码错误,汉字无效,需要进行编码转换,如下所示:
1 public IActionResult Test2()2 {3 var author = HttpUtility.UrlEncode("公子小六", Encoding.UTF8);4 Response.Headers.Add("Author", author);5 return Json("ABC");6 }
请求示例如下所示:
会话Session
由于Http请求是无状态的,单次请求完成后,就会进行释放,那么如何在无状态的请求中,保留一些相关的数据呢?这就用到了Session,Session在用户打开浏览器登录系统开始,到关闭浏览器退出系统结束,将用户请求的一些数据,以键值对的形式保存在服务器端的缓存中,可以解决无状态协议模式下数据的频繁传递传递,减少请求数据量,提高性能。Session一般应用在小型的单体应用程序中,对于大型的分布式程序,则不适用。
每一个用户的浏览器请求都有自己的Session内存块,不会和其他用户的请求相混淆。
要启用Session,首先需要在Program.cs中添加Session服务,和启用Session中间件,如下所示:
1 using DemoCoreMVC.Services; 2 using Microsoft.AspNetCore.Server.Kestrel.Core; 3 using System.Text.Encodings.Web; 4 using System.Text.Unicode; 5 6 var builder = WebApplication.CreateBuilder(args); 7 8 // Add services to the container. 9 builder.Services.AddControllersWithViews().AddJsonOptions(options =>10 {11 options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);12 });13 14 builder.Services.Configure(options =>15 {16 options.AllowSynchronousIO = true;17 });18 19 //1. 往容器中添加Session服务,启用Session服务20 builder.Services.AddSession();21 22 var app = builder.Build();23 24 // Configure the HTTP request pipeline.25 if (!app.Environment.IsDevelopment())26 {27 app.UseExceptionHandler("/Home/Error");28 // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.29 app.UseHsts();30 }31 32 //2.使用Session中间件,主要用于拦截Http请求33 app.UseSession();34 app.UseHttpsRedirection();35 app.UseStaticFiles();36 37 //1. 添加路由中间件EndpointRoutingMiddleware38 app.UseRouting();39 app.MapControllers();40 app.UseAuthorization();41 42 app.MapControllerRoute(43 name: "default",44 pattern: "{controller=Home}/{action=Index}/{id?}");45 46 47 app.Run();
Session属性和方法
在实际应用中,一般使用扩展方法SetString(key,value),GetString(key)进行Session值的设置和获取,如下所示:
注意,关于Session使用,有以下两点需要注意:
- 在控制器中,可以直接使用Session属性
- 在非控制器中,可以使用请求上下文HttpContext进行获取。
Session示例
以常用的登录为例,实现如下功能:
- 用户打开登录页面,输入账号密码,点击登录按钮
- 验证用户名密码,验证成功后,保存Session,跳转到首页
- 首页获取Session中保存的内容,并通过ViewBag传递到客户端,显示在页面上。
首先创建控制器LoginController,如下所示:
1 namespace DemoCoreMVC.Controllers 2 { 3 public class LoginController : Controller 4 { 5 public IActionResult Index() 6 { 7 return View(); 8 } 9 10 public IActionResult Login()11 {12 var username = Request.Form["username"];13 var password = Request.Form["password"];14 if(username=="admin" && password == "abc123")15 {16 HttpContext.Session.SetString("username", username);17 }18 return Redirect("/Home");19 }20 }21 }
然后创建Login/Index.cshtml视图,如下所示:
1
修改HomeController中代码,如下所示:
1 public class HomeController : Controller 2 { 3 4 public HomeController() 5 { 6 } 7 8 public IActionResult Index() 9 {10 var username = HttpContext.Session.GetString("username");11 ViewBag.Username = username;12 return View();13 }14 }
Home/Index.cshtml中修改代码,获取ViewBag传递的值,如下所示:
12Welcome @ViewBag.Username
3Learn about building Web apps with ASP.NET Core.
4
以上就是Session示例的创建和获取的相关代码,页面测试如下所示:
Session唯一标识
每一个浏览器打开的Session都有一个唯一标识,在控制器中,可以通过HttpContext.Session.Id进行区分。可以在Program.cs中添加服务到容器时配置相关参数,如下所示:
1 //1. 往容器中添加Session服务,启用Session服务2 builder.Services.AddSession(option =>3 {4 option.IdleTimeout = TimeSpan.FromMinutes(10);5 option.Cookie.Name = "DemoMvcCore";6 });
设置Session选项中的Cookie的名称后,会在浏览器客户端创建对应的值,如下所示:
参考文章
本篇文章主要参考内容如下:
1. https://learn.microsoft.com/zh-cn/dotnet/api/microsoft.aspnetcore.http.httpcontext?view=aspnetcore-7.0
2.https://learn.microsoft.com/zh-cn/dotnet/api/microsoft.aspnetcore.http.httprequest?view=aspnetcore-7.0
3.https://learn.microsoft.com/zh-cn/dotnet/api/microsoft.aspnetcore.http.httpresponse?view=aspnetcore-7.0
4.https://learn.microsoft.com/zh-cn/dotnet/api/microsoft.aspnetcore.http.isession?view=aspnetcore-7.0
以上就是ASP.NET Core MVC从入门到精通之HttpContext的全部内容。
关键词:
ASP.NET Core MVC 从入门到精通之HttpContext
24 操作系统的网络架构
AMD RX 7000全家倾巢出动 卡皇现世!苏姿丰:敬请期待
热心大哥高铁怒斥熊孩子家长获喝彩:掌声响起-世界最新
各地陆续迎来假期返程高峰
热推荐:汽油价格还要再大降?国际油价已跌超5%
全球今头条!徐州市人力和社会资源保障局网站_徐州市人力资源和社会保障网
最新:马斯克的星舰首飞:到底是成功了?还是失败了?
五一返程高峰遇强降雨 多地堵上加堵:局部140毫米大暴雨-热消息
天文专家回应哈尔滨现不明飞行物:可能是卫星残骸 没必要恐慌 每日资讯
KubeVela 稳定性及可扩展性评估_环球微动态
随机造数据的技巧总结
dotnetfx35无法安装_dotnetfx35
游客手机掉西湖被要1500元打捞费 景区:简单打捞不收费-全球观察
员工朋友圈未发广告被罚1万且开除:法院判赔5万 当前短讯
印度捷行航空申请破产 原因想不到:普惠发动机故障太多-视点
环球聚焦:appuploader 入门使用
环球快看点丨1、etcd基础介绍
【实变函数】01 - 更合理的积分
每日信息:关于如何使用pandas将不同的数据写入到同一个Excel的不同Sheet表中
【世界新视野】1159 Structure of a Binary Tree + 根据前序和中序构建二叉树+ 层序遍历模板复习
【e公司观察】原料涨价 锂电行业为何振奋不已?|当前看点
四川自贡一餐厅吃饭收15元空调费 店家:相当于雅间费-全球今头条
各主要高速公路、国省道干线交通总体安全顺畅 最新消息
热讯:写几行代码,了解响应式原理
第139篇:JS数组常用方法(map(),reduce(),foreach())
83.赋值运算符
IMF:中国将成为今年亚太地区经济增长关键驱动因素
有钱人为何在意电动车电费?李想用超级富豪朋友习惯解释原因-全球讯息
环球速看:格科微: 格科微有限公司关于公司实际控制人、董事长、首席执行官提议公司回购股份的公告
【2023 · CANN训练营第一季】昇腾AI入门Pytorch
世界微动态丨23 网络数据在内核中流转
ZooKeeper 避坑指南: ZooKeeper 3.6.4 版本 BUG 导致的数据不一致问题
5月3日全国铁路迎来返程客流高峰 预计发送旅客1935万人次 世界独家
上海妍秀国际医疗美容诊所医生以及擅长项目推荐
报道:上半年最后一个假 端午节放3天:假期后需连上6天班
《街霸6》新角色韩蛛俐介绍片:疯美人脚法了得-全球观天下
Bash—source命令&export命令&bashrc文件
最新快讯!三星宣布多款旧设备停止更新支持
清仓特价 森马板鞋/运动鞋39元起、T恤29元起-要闻速递
今日快讯:又一个小米6钉子户消失 米粉给妈妈换小米13 雷军点赞
22 URL到网卡:网络数据流动
“广州市十佳科普使者”出炉|全球观察
五一余额不足 最后一天返程现场排长队 网友:凌晨出门照堵不误
“插队婆孙”被做成恶搞表情包:如此“网暴”是否合适?
【全球聚看点】OpenAI API keys 的申请和测试小结
母子争吵儿子走丢 机场民警15分钟帮找到孩子|播资讯
【世界速看料】最便宜的16GB显存显卡出现了!AMD、NVIDIA统统靠边站
焦点报道:苹果、谷歌起草追踪设备行业规范:打击滥用定位功能
当前短讯!实惨!男子拍演唱会:激光导致手机摄像头直接报废
Realme 11 Pro+ 5G 曝光 在5月10日发布
66元的的钟薛高在东北只要3.8元一根!商家回应
开眼!丰田为混动车申请“手动挡”专利:只为保留驾驶乐趣 环球热推荐
游客停车31小时被收640元:明码标价 但已退还
Blazor学习之旅系列总结目录
国铁集团郑州局预计3日客流创历史新高
小学生写人作文开头结尾集锦_小学生写人作文-观速讯
【天天时快讯】阿维塔定金72小时内可退成空话 店长:“已锁单”
汽车盗窃案上升548% 纽约市免费发放500个苹果AirTag应对
【当前独家】 男子吐槽在景区停车场一路捡到26个螺丝钉 官方回应
青海省西宁市城西区西川南路消防救援站站长助理玛尼坚——磨砺技能 守护平安(劳动者之歌)
多地消费市场见闻
世界资讯:客户抛弃雷克萨斯LM来买 腾势D9 4月销量10526辆
19.99万元期待落空 打价格战的特斯拉为何突然涨价:利润下滑
观速讯丨Intel AVX-512指令集要回来!残血版?AMD正尽情享受
世界最资讯丨艾玛·沃森曝光新写真 透露2024年开拍新电影
24小时不打烊,365天对外接待……“临汾好办”不要太方便! 环球播资讯
每日热文:前缀和
可怜的欧美!RTX 3070上市两年半 终于破发|今头条
环球头条:雷蛇噬魂鲨极速版耳机发布:50mm驱动单元、30小时续航
别只会“王者峡谷五日游” 这几款游戏才是假期最佳解
每日关注!4月新能源销量:比亚迪、埃安、理想全线杀疯
全球要闻:巨亏236亿元!三星内存、闪存要减产25%
天天热头条丨“天空之城”游人如织
学系统集成项目管理工程师(中项)系列16b_风险管理(下)
世界观点:4年来首次下滑 AMD发布Q1季度财报:锐龙处理器成重灾区
五菱缤果营销比亚迪海豚话术曝光:颜值高、空间大
【速看料】五一后机票价格暴跌 飞三亚从2800降到280元 专家表态:很正常
联合国秘书长:呼吁以色列停止行政拘留的做法|全球观焦点
python图像处理库
Java读取数据库表
世界今热点:徊的拼音_徊怎么组词
流媒体时代谋生艰难!好莱坞编剧15年来将首次罢工
为何插电混动车主爱在外充电 理想高管分析:薅羊毛感觉爽
当前资讯!司机等红绿灯时看手机被罚200扣3分 车是静止状态:网友吵翻 但事实没错
NV一代神卡卷土重来!Steam新报告:RTX 40降价仍没存在感_当前热议
五一想在户外看电影、选购投影仪一定要注意这几点
浙商证券研究所所长助理陈杭离职:否认网传800万年薪,专心处理舆论_世界热资讯
81.数组 全球热门
Win11“颠覆性”功能被遗弃:失效三个月仍被微软无视
嘴硬还是明智?丰田高管:电动汽车技术不成熟、混动才实用
同花顺ai机构活跃度指标公式源码_活跃度100
Android-图片压缩(二)-纯干货
C# 常量 结构体 委托 热门看点
喝的二五八万是什么意思_二五八万是什么意思
性能达SteamDeck两倍!华硕ROG Ally掌机先行开箱来了
奇葩!插队发飙者称是换队 网友吐槽发飙发泼有理:景区称仍算插队
天天热议:手机就能跑!开源AI机器人MLC LLM发布:无需联网
喜欢玩手机 那就活该单身
沃尔沃首款全电动汽车现已准备好接触其首批英国客户