/// <summary> /// 复制请求头 /// </summary> /// <param name="context"></param> /// <param name="webRequest"></param> protected virtual void CopyRequestHeaders(HttpContext context, HttpWebRequest webRequest) { // 扩展点:允许替换默认实现方式 // 复制请求头 foreach (string name in context.Request.Headers.AllKeys) { // 过滤不允许直接指定的请求头 if (s_IgnoreRequestHeaders.FirstOrDefault(x => x.Equals(name, StringComparison.OrdinalIgnoreCase)) != null) { continue; } string value = context.Request.Headers[name]; SetRequestHeader(context, webRequest, name, value); } // 增加一个特殊的标记,在 StreamResult.cs 中会有对应的处理逻辑 webRequest.Headers.Add("x-HttpProxyHandler", "1"); webRequest.Headers.Add("x-UserHostAddress", context.Request.UserHostAddress); //webRequest.Headers.Remove("Cache-Control"); if (string.Equals(context.Request.Headers["Connection"], "keep-alive", StringComparison.OrdinalIgnoreCase)) { webRequest.KeepAlive = true; } string referer = context.Request.Headers["Referer"]; if (string.IsNullOrEmpty(referer) == false) { if (referer.IndexOf("://") > 0) { string refererRoot = UrlExtensions.GetWebSiteRoot(referer); string requestRoot = UrlExtensions.GetWebSiteRoot(webRequest.RequestUri.AbsoluteUri); string referer2 = requestRoot + referer.Substring(refererRoot.Length); SetRequestHeader(context, webRequest, "Referer", referer2); } } }