如何在C#应用中传递HTTP请求头至下游服务
解决请求头转发到下游服务的问题
作为C#新手,在做HTTP请求转发的编码应用时,不知道怎么把上游请求的头信息传递给下游服务是很正常的~ 咱们完全可以基于你现有的HttpClient代码来实现,不需要换成WebClient,下面一步步来修改你的代码:
步骤1:修改ConnToSys的MakeRequest方法,添加请求头参数
首先给这个方法加上接收请求头的参数,然后在方法内部解析并添加到HttpClient中:
public class ConnToSys { // 修改方法签名,新增headers参数 public HttpResponseMessage MakeRequest(HttpContent request, string path, string headers) { string URL = "http://" + ConfigurationManager.AppSettings["systemHost"] + ":" + ConfigurationManager.AppSettings["systemPort"] + path; HttpClient client = new HttpClient(); client.BaseAddress = new Uri(URL); // 新增:解析上游请求头并添加到HttpClient foreach (var raw_header in headers.Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries)) { var index = raw_header.IndexOf(':'); if (index <= 0) continue; var key = raw_header.Substring(0, index); var value = index + 1 >= raw_header.Length ? string.Empty : raw_header.Substring(index + 1).TrimStart(' '); // 使用TryAddWithoutValidation避免受限制请求头报错(比如Content-Length) client.DefaultRequestHeaders.TryAddWithoutValidation(key, value); } HttpResponseMessage response = client.PostAsync(URL, request).Result; if (!response.IsSuccessStatusCode) { Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase); } client.Dispose(); return response; } }
步骤2:在Post方法中传递上游请求头
修改接收客户端请求的Post方法,获取当前请求的头信息,再传递给MakeRequest:
public HttpResponseMessage Post(HttpRequestMessage request) { HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK); string path = request.RequestUri.AbsolutePath; try { // 此处为你的编码逻辑... // 获取上游请求的头信息 string requestHeaders = request.Headers.ToString(); // 将编码后的请求和头信息一起发送至目标系统 ConnToSys connection = new ConnToSys(); response = connection.MakeRequest(BinRequest, path, requestHeaders); } catch (Exception ex) { // 你的异常处理逻辑... } // 此处为你的解码逻辑... // 将结果返回给客户端 return response; }
额外注意事项
- 为什么用
TryAddWithoutValidation?:像Content-Length这类由HttpClient自动管理的请求头,手动添加会触发报错,这个方法会自动跳过这些受限制的头,避免抛出异常。 - 优化资源管理:建议用
using语句包裹HttpClient,比手动调用Dispose()更稳妥:
using (HttpClient client = new HttpClient()) { // 你的请求逻辑代码 }
内容的提问来源于stack exchange,提问作者rbt
相关产品推荐
相关产品推荐

