需求
常見的需求就是從 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 而已.