public class ProxyMiddleware
{
// private ProxyHttpClient _proxyHttpClient;
private const string CDN_HEADER_NAME = "Cache-Control";
private static readonly string[] NotForwardedHttpHeaders = new[] { "Connection", "Host" };////Http頭檔案的這兩個屬性在下面代碼中用到,這兩個狀態屬性是什么意思,如果頭檔案中沒有這兩個屬性,代表什么意思呢?
private readonly RequestDelegate _next;
private readonly ILogger<ProxyMiddleware> _logger;
public ProxyMiddleware(
RequestDelegate next,
ILogger<ProxyMiddleware> logger
)
{
_next = next;
_logger = logger;
//_proxyHttpClient = proxyHttpClient;
}
/// <summary>
/// 通過中間件,攔截訪問,檢測前綴,并轉發
/// </summary>
/// <param name="context"></param>
/// <param name="urlRewriter"></param>
/// <returns></returns>
public async Task Invoke(HttpContext context, IUrlRewriter urlRewriter, ProxyHttpClient proxyHttpClient)
{
var targetUri = await urlRewriter.RewriteUri(context);
if (targetUri != null)
{
var requestMessage = GenerateProxifiedRequest(context, targetUri);
await SendAsync(context, requestMessage, proxyHttpClient);
return;
}
await _next(context);
}
private async Task SendAsync(HttpContext context, HttpRequestMessage requestMessage, ProxyHttpClient proxyHttpClient)
{
using (var responseMessage = await proxyHttpClient.Client.SendAsync(requestMessage, HttpCompletionOption.ResponseHeadersRead, context.RequestAborted))
{
context.Response.StatusCode = (int)responseMessage.StatusCode;
foreach (var header in responseMessage.Headers)
{
context.Response.Headers[header.Key] = header.Value.ToArray();
}
foreach (var header in responseMessage.Content.Headers)
{
context.Response.Headers[header.Key] = header.Value.ToArray();
}
context.Response.Headers.Remove("transfer-encoding");
if (!context.Response.Headers.ContainsKey(CDN_HEADER_NAME))
{
context.Response.Headers.Add(CDN_HEADER_NAME, "no-cache, no-store");
}
await responseMessage.Content.CopyToAsync(context.Response.Body);
}
}
private static HttpRequestMessage GenerateProxifiedRequest(HttpContext context, Uri targetUri)
{
var requestMessage = new HttpRequestMessage();
CopyRequestContentAndHeaders(context, requestMessage);
requestMessage.RequestUri = targetUri;
requestMessage.Headers.Host = targetUri.Host;
requestMessage.Method = GetMethod(context.Request.Method);
return requestMessage;
}
private static void CopyRequestContentAndHeaders(HttpContext context, HttpRequestMessage requestMessage)
{
var requestMethod = context.Request.Method;
if (!HttpMethods.IsGet(requestMethod) &&
!HttpMethods.IsHead(requestMethod) &&
!HttpMethods.IsDelete(requestMethod) &&
!HttpMethods.IsTrace(requestMethod))
{
var streamContent = new StreamContent(context.Request.Body);
requestMessage.Content = streamContent;
}
foreach (var header in context.Request.Headers)
{
if (!NotForwardedHttpHeaders.Contains(header.Key))////Http頭檔案的這兩個屬性(connection,Host)這兩個狀態屬性是什么意思,如果頭檔案中沒有這兩個屬性,代表什么意思呢?
{
if (header.Key != "User-Agent")//////這句判斷又什么意思呢?
{
if (!requestMessage.Headers.TryAddWithoutValidation(header.Key, header.Value.ToArray()) && requestMessage.Content != null)
{
requestMessage.Content?.Headers.TryAddWithoutValidation(header.Key, header.Value.ToArray());
}
}
else
{
string userAgent = header.Value.Count > 0 ? (header.Value[0] + " " + context.TraceIdentifier) : string.Empty;
if (!requestMessage.Headers.TryAddWithoutValidation(header.Key, userAgent) && requestMessage.Content != null)
{
requestMessage.Content?.Headers.TryAddWithoutValidation(header.Key, userAgent);////主體檔案屬性里又都多了個頭屬性,這個頭屬性又啥意思,請結合代碼幫解釋下。
}
}
}
}
}
private static HttpMethod GetMethod(string method)
{
if (HttpMethods.IsDelete(method)) return HttpMethod.Delete;
if (HttpMethods.IsGet(method)) return HttpMethod.Get;
if (HttpMethods.IsHead(method)) return HttpMethod.Head;
if (HttpMethods.IsOptions(method)) return HttpMethod.Options;
if (HttpMethods.IsPost(method)) return HttpMethod.Post;
if (HttpMethods.IsPut(method)) return HttpMethod.Put;
if (HttpMethods.IsTrace(method)) return HttpMethod.Trace;
return new HttpMethod(method);
}
uj5u.com熱心網友回復:
private static readonly string[] NotForwardedHttpHeaders = new[] { "Connection", "Host" };////Http頭檔案的這兩個屬性在下面代碼中用到,這兩個狀態屬性是什么意思,如果頭檔案中沒有這兩個屬性,代表什么意思呢?uj5u.com熱心網友回復:
Request.Headers的屬性可以參考這篇文章:https://blog.csdn.net/qq_41807489/article/details/104372202如果標準的請求頭是NotForwardedHttpHeaders中的則進行處理
if (header.Key != "User-Agent")就是判斷這個頭資訊不是關于瀏覽器的
//獲取用戶代理中的第一個屬性,用于判斷瀏覽器型別
string userAgent = header.Value.Count > 0 ? (header.Value[0] + " " + context.TraceIdentifier) : string.Empty;
if (!requestMessage.Headers.TryAddWithoutValidation(header.Key, userAgent) && requestMessage.Content != null)
{
requestMessage.Content?.Headers.TryAddWithoutValidation(header.Key, userAgent);
////主體檔案屬性里又都多了個頭屬性,這個頭屬性又啥意思,請結合代碼幫解釋下。
//如果TryAddWithoutValidation回傳false或者requestMessage.Content != null就再執行TryAddWithoutValidation,沒有多一個頭屬性
}
uj5u.com熱心網友回復:
看了你給推薦的文章,非常感謝。if (!requestMessage.Headers.TryAddWithoutValidation(header.Key, userAgent) && requestMessage.Content != null)
{
requestMessage.Content?.Headers.TryAddWithoutValidation(header.Key, userAgent);
////主體檔案屬性里又都多了個頭屬性,這個頭屬性又啥意思,請結合代碼幫解釋下。
//如果TryAddWithoutValidation回傳false或者requestMessage.Content != null就再執行TryAddWithoutValidation,沒有多一個頭屬性
}
這兩個還沒搞懂

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/273941.html
標籤:ASP.NET
上一篇:WPF Popup控制元件的使用
