【发布时间】:2018-09-25 06:11:10
【问题描述】:
我正在为想要与另一台服务器上的 API 通信的 ASP.NET MVC 应用程序实现一个透明的服务器端代理;代码相当简单:
public class TransparentProxyDelegatingHandler : DelegatingHandler
{
private static readonly Uri ApiUri;
private static readonly HttpClient Client;
static TransparentProxyDelegatingHandler()
{
var apiServer = new Uri(ConfigurationManager.AppSettings["ApiUrl"]);
ApiUri = new Uri(apiServer);
Client = new HttpClient();
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
request.Headers.Add("X-Forwarded-For", request.GetClientIpAddress());
request.RequestUri = TranslateIncomingRequestToUpstreamApi(request);
request.Headers.AcceptEncoding.Clear();
var response = await Client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken);
return response;
}
private static Uri TranslateIncomingRequestToUpstreamApi(HttpRequestMessage request)
{
var forwardUri = new UriBuilder(request.RequestUri)
{
Host = ApiUri.Host,
Path = request.RequestUri.AbsolutePath.Replace("/Proxy", string.Empty)
};
return forwardUri.Uri;
}
}
所以如果我查询GET https://ui.myserver.com/proxy/timesheets?from=2018-01-01,请求URI 会被代理更改为GET https://api.myserver.com/timesheets?from=2018-01-01,我可以在调试器中验证这一点;但是,当调用SendAsync方法时,请求URI的主机名部分改回https://ui.myserver.com,调用失败。
为什么当我调用 SendAsync 时它会改变 request.RequestUri 的值?我已经检查了 GitHub (https://github.com/dotnet/corefx/blob/master/src/System.Net.Http/src/System/Net/Http/HttpClient.cs) 中的源代码,但更改值的条件似乎都不适用于我的情况。不幸的是,GitHub 源代码与调试符号不一致,所以我似乎无法进入 HttpClient 源代码来弄清楚到底发生了什么。
【问题讨论】:
标签: c# asp.net-web-api dotnet-httpclient