需求

常见的需求就是从 request 里面读取一些 information. 比如

request URL, header, cookie,

写入 response header, cookie

实战

Razor Page Model 中

// 读取 request, header, cookie
var fullUrl = HttpContext.Request.GetDisplayUrl(); // https://192.168.1.152:44300/?value=v1&value=v2 (note: about 的话是 .../about?value=v1, 不是 .../about/?value=v1 哦)
var scheme = HttpContext.Request.Scheme; // https
var host = HttpContext.Request.Host.Host; // 192.168.1.152
var port = HttpContext.Request.Host.Port; // 44300
var path = HttpContext.Request.Path; // "/" <-- home page 的 path 是 /
var queryString = HttpContext.Request.QueryString.Value; // ?value=v1&value=v2
var query = HttpContext.Request.Query;
if (query.TryGetValue("value", out StringValues value))
{
// same key won't combine
var value1 = value.ElementAt(0); // v1
var value2 = value.ElementAt(1); // v2
var combineValue = value.ToString(); // v1,v2
}
var remoteIp = HttpContext.Connection.RemoteIpAddress; if (HttpContext.Request.Cookies.TryGetValue("cookie1", out var cookieValue))
{ }
var userAgent = HttpContext.Request.Headers.UserAgent.ToString();
var contentType = HttpContext.Request.Headers.ContentType.ToString();
if (HttpContext.Request.Headers.TryGetValue("Custom-Header", out StringValues customHeaderValue)) // h1,h2
{
var h1 = customHeaderValue.ElementAt(0); // h1,h2
var h2 = customHeaderValue.ElementAtOrDefault(1); // null
var combineHeader = customHeaderValue.ToString(); // h1,h2
// same key will combine become value1 value2
}; // 写入 header, cookie
HttpContext.Response.Headers.Append("CustomResponseHeader", "value1");
HttpContext.Response.Cookies.Append("cookie1", "value1");

可以看到关键就是 HttpContext, request, response 都可以通过这个去读写.

header 和 query 如果遇到有 2 个 key (虽然我不知道什么情况下会需要这样), header 是会 combine value 而 query 是不会的哦

queryString 获取的值就是 original 的值, 是含 encode 的, 调用 TryGetValue 的时候我们则不需要顾虑 encode, decode, 它会替我们处理好.

更多关于 query 的操控可以看这篇

razor .cshtml

我们依然可以调用到 HttpContext

@HttpContext.Request.Headers.UserAgent

Web API Controller

var userAgent = HttpContext.Request.Headers.UserAgent;

DI Service

要在 service 中获取到 Httpcontext 就需要依赖注入.

首先在 startup.cs

services.AddHttpContextAccessor();

源码

然后在 Service.cs, 通过 HttpContextAccessor 就可以获取到 HttpContext 了

public class CustomerService
{
private readonly HttpContext _httpContext;
public CustomerService(
IHttpContextAccessor httpContextAccessor
)
{
_httpContext = httpContextAccessor.HttpContext!;
} public string GetUserAgent()
{
return _httpContext.Request.Headers.UserAgent;
}
}

MVC View 中

Razor Pages 是 HttpContext 而 MVC VIew 是 Context 而已.

ASP.NET Core – 读写 Request / Response的更多相关文章

  1. 深入探究ASP.NET Core读取Request.Body的正确方式

    前言 相信大家在使用ASP.NET Core进行开发的时候,肯定会涉及到读取Request.Body的场景,毕竟我们大部分的POST请求都是将数据存放到Http的Body当中.因为笔者日常开发所使用的 ...

  2. 配置 ASP.NET Core 请求(Request)处理管道

    配置 ASP.NET Core 请求(Request)处理管道 在本节中,我们将讨论使用中间件组件为 asp.net core 应用程序配置请求处理管道. 作为应用程序启动的一部分,我们要在Confi ...

  3. asp.net core 系列之Response caching(1)

    这篇文章简单的讲解了response caching: 讲解了cache-control,及对其中的头和值的作用,及设置来控制response caching; 简单的罗列了其他的缓存技术:In-me ...

  4. ASP.NET Core中如果Response.HasStarted已经为true,就不能更改Response.Cookies和Response.Headers等属性的值了

    最近我在ASP.NET Core中做了一个中间件CustomizedMiddleware,要说该中间件的功能也很简单,其实就是往HttpResponse中添加一个Cookie而已,但是我将添加Cook ...

  5. asp.net core 系列之Response caching 之 Distributed caching(3)

    这篇文章讲解分布式缓存,即 Distributed caching in ASP.NET Core Distributed caching in ASP.NET Core 分布式缓存是可以在多个应用服 ...

  6. 如何在ASP.NET Core自定义中间件中读取Request.Body和Response.Body的内容?

    原文:如何在ASP.NET Core自定义中间件中读取Request.Body和Response.Body的内容? 文章名称: 如何在ASP.NET Core自定义中间件读取Request.Body和 ...

  7. ASP.NET Core文件上传IFormFile于Request.Body的羁绊

    前言 在上篇文章深入探究ASP.NET Core读取Request.Body的正确方式中我们探讨了很多人在日常开发中经常遇到的也是最基础的问题,那就是关于Request.Body的读取方式问题,看是简 ...

  8. 由ASP.NET Core读取Response.Body引发的思考

    前言 前几天有群友在群里问如何在我之前的文章<ASP.NET Core WebApi返回结果统一包装实践>的时候有点疑问,主要的疑问点就是关于Respouse的读取的问题.在之前的文章&l ...

  9. ASP.NET Core 运行原理解剖[4]:进入HttpContext的世界

    HttpContext是ASP.NET中的核心对象,每一个请求都会创建一个对应的HttpContext对象,我们的应用程序便是通过HttpContext对象来获取请求信息,最终生成响应,写回到Http ...

  10. Nginx+Docker部署模式下 asp.net core 获取真实的客户端ip

    目录 Nginx+Docker部署模式下 asp.net core 获取真实的客户端ip 场景 过程还原 结论 参考资料 Nginx+Docker部署模式下 asp.net core 获取真实的客户端 ...

随机推荐

  1. 重磅集结!CNCF/VMware/PingCAP/网易数帆/阿里云联合出品云原生生态大会

    "云原生(Cloud Native)"这个词在2020年刷屏了.在企业积极进行数字化转型,全面提升效率的今天,云原生被认为是云计算的"下一个时代". 12月16 ...

  2. webpack4.15.1 学习笔记(十) — 常见 loader 使用

    目录 style -loader <= css-loader <= less-loader postcss-loader file-loader url-loader html-withi ...

  3. 欧拉系统初体验与编译安装FFmpeg的过程记录

    目录 源起 1. 系统下载 2. 系统安装 2.1 磁盘分区 2.2 软件数量 2.3 安装完毕 3.进入系统 4.安装FFmpeg 4.1 下载FFmpeg 4.2 解压程序 4.3 检查环境 4. ...

  4. C# WinForm自制项目模板入坑记

    1. 创建模板配置 1.1 在项目目录中创建.template.config文件夹 1.2 创建一个名为"template.json" 的新文件 { "author&qu ...

  5. PyQt 右键菜单的实现(Qt.CustomContextMenu方式)

    从Qt文档Qt::ContextMenuPolicy的值可以看出,实现右键菜单的方式有三种,这对于所有继承于QWidget的类都是通用的,在用每一种方式实现之前都要调用QWidget::setCont ...

  6. Oracle 删除大量表记录操作总结

    By:授客 QQ:1033553122 删除表数据操作 清空所有表记录 TRUNCATE TABLE your_table_name; 或者批量删除满足条件的表记录 BEGIN LOOP DELETE ...

  7. 把python中的列表转化为字符串

    怎么把python中的列表转换为字符串: 1,列表中非字符串的元素的转换 方法一: 使用列表推导式进行转换 1 list=['hello',6,9,'beizhi'] 2 list=[str(i) f ...

  8. nacos启动失败:No DataSource set

    通过docker查看nacos的日志发现nacos好端端的突然不能用了 docker logs nacos 报错后说是no datasource set,我看了我在docker里的MySQL是正常启动 ...

  9. app专项测试:app弱网测试(网络测试流程)

    app专项测试:app弱网测试(网络测试流程) 一.网络测试的一般流程 step1:首先要考虑网络正常的情况 ① 各个模块的功能正常可用 ② 页面元素/数据显示正常 step2:其次要考虑无网络的情况 ...

  10. 我用Awesome-Graphs看论文:解读X-Stream

    X-Stream论文:<X-Stream: Edge-centric Graph Processing using Streaming Partitions> 前面通过文章<论文图谱 ...