HttpContext 类型的属性和方法

754 阅读4分钟

ASP.NET Core 本质是一个控制台程序!ASP.NET Core 程序并不直接监听请求,而是通过依赖 HTTP Server ,来实现把各自请求转发到应用程序中。这个被转发的请求相当于我们日常浏览网页、上传文件、提交表单等的网络请求,这些请求会被包装,然后组合到 HttpContext 中。

就好像顾客到餐厅吃饭

  1. 需要先点菜、提出服务要求
  2. 服务员把你的菜单、需求送到厨房
  3. 厨师在加工好食品
  4. 服务员再把食品递给你

HttpContext 相当于这个服务员,她在前、后传递信息。

HttpContext 类型的属性和方法

在 ASP.NET Core 中,系统为每一个请求分配一个线程,HttpContext 针对的,就是一个线程。所以它的类、方法、属性等,都是针对当前请求起作用。

Properties(特性)

Authentication               这个已经用不到了,这里只是列一下表。用于身份认证(ASP.NET中用到),官方不建议在ASP.NT Core中使用。替代方案 Microsoft.AspNetCore.Authentication.AuthenticationHttpContextExtensions
Connection获取有关此请求的基础连接的信息
Features获取此请求上可用的服务器和中间件提供的HTTP特性的集合
Items获取或设置可用于在该请求范围内共享数据的键/值集合
Request请求
RequestAborted通知此请求基础的连接何时中止,因此请求操作应取消
RequestServices获取或设置 IServiceProvider 集合,提供访问的请求的服务容器
Response响应
Session获取或设置用于管理此请求的用户会话数据的对象
TraceIdentifier获取或设置用于在跟踪日志中表示此请求的唯一标识符
User获取或设置此请求的用户
WebSockets获取一个对象,该对象管理此请求的WebSu套连接的建立

Item、Session、Response 等对象都是需要经常使用到的,下面笔者会详细实践。

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.
HeadersGets the request headers.
Host获取或设置主机头。可以包括端口
HttpContext获取或设置请求上下文
IsHttps检测当前是否HTTPS连接
Method获取或设置HTTP方法
Path获取或设置当前请求的路径,即URL
PathBase获取或设置 RequestPathBase,就是URL前面那一段,如docs.microsoft.com
ProtocolGets or sets the RequestProtocol.
Query查询字符串的集合
QueryString获取或设置用于在Request.Query中创建查询集合的原始查询字符串
Scheme获取或设置HTTP请求方案

试一试

打开 Index.Cshtml ,把以下代码加上去

(为了看得清楚一点,我加了表格)

<table>
    <tr>
        <td>RequestBody流</td>
        <td> @Model.Request.Body</td>
    </tr>
    <tr>
        <td>Content-Length头</td>
        <td>@Model.Request.ContentLength</td>
    </tr>
    <tr>
        <td>Content-Type头</td>
        <td> @Model.Request.ContentType</td>
    <tr>
        <td>Cookies </td>
        <td>@Model.Request.Cookies</td>
        </tr>
    <tr>
        <td>IsHttps</td>
        <td>@Model.Request.IsHttps</td>
        </tr>
    <tr>
        <td>Host </td>
        <td>@Model.Request.Host</td>
    </tr>

</table>

运行Web程序,结果如下

在浏览器 F12 后,可以看到控制台的内容。请查看 下图的 1、3部分

Request 的其它使用方法,就不再赘述,你可以在视图中 @Model.Request. 加上需要测试的属性即可。

推荐别人关于 Request 的文章 www.cnblogs.com/Sea1ee/p/72…

Response

Request 是 客户端向 Web 发送请求,而 Response 则是 Web 响应 客户端 的请求。这里笔者就不全部翻译了

使用Response可以直接影响服务器响应,设置响应内容、响应类型(发送网页、文件、图片等)、视图响应前重定向。

Response 应该在控制器中使用。具体使用方法笔者这里就不赘述。

Body获取或设置响应体流
ContentLength     Gets or sets the value for the Content-Type response header.
ContentType获取或设置内容类型响应标头的值
Cookies获取一个对象,该对象可用于管理此响应的Cookie
HasStartedGets a value indicating whether response headers have been sent to the client.
HeadersGets the response headers.
HttpContextGets the HttpContext for this response.
StatusCodeGets or sets the HTTP response code.

Response 的方法

     OnCompleted(Func) 在响应已发送到客户端之后添加要调用的委托
     OnCompleted(Func<Object,Task>, Object)          响应已发送到客户端之后添加要调用的委托
     OnStarting(Func)在响应头将被发送到客户端之前添加要调用的委托
     OnStarting(Func<Object,Task>, Object)在响应头将被发送到客户端之前添加要调用的委托
     Redirect(String)向客户端返回一个临时重定向响应(HTTP 302)
     Redirect(String, Boolean)向客户端返回重定向响应(HTTP 301或HTTP 302)
     RegisterForDispose(IDisposable)处置(不可分)在请求完成处理后,注册主机处理的对象                                                               

Response 拓展方法

GetTypedHeaders(HttpResponse)
WriteAsync(HttpResponse, String, Encoding, CancellationToken)取消令牌使用给定的编码将给定文本写入响应体
WriteAsync(HttpResponse, String, CancellationToken)将给定文本写入响应体。UTF-8编码将被使用
Clear(HttpResponse)
SendFileAsync(HttpResponse, IFileInfo, Int64, Nullable, CancellationToken)     使用Sendfile 扩展发送给定的文件
SendFileAsync(HttpResponse, IFileInfo, CancellationToken)Sends the given file using the SendFile extension.
SendFileAsync(HttpResponse, String, Int64, Nullable, CancellationToken)Sends the given file using the SendFile extension.
SendFileAsync(HttpResponse, String, CancellationToken)Sends the given file using the SendFile extension.

请参考下图的第 2 部分