用于ASP.NET Web API请求的"透明"服务器端代理

AGS*_*AGS 5 asp.net-mvc-4 asp.net-web-api

拥有一个生成JSON响应的ASP.NET Web API端点.但由于两个因素无法直接从浏览器中消耗.

  1. 跨域问题
  2. 需要为仅知道服务器端的API提供会话票证

因此,我需要一个轻量级服务器端代理,用于客户端(浏览器)请求,以使用会话密钥扩展请求.不希望在代理代码中强加开销反序列化客户端JSON请求或Web API JSON响应.想要"按原样"传递有效负载并反序列化客户端请求,只有Web API端和Web API响应只有客户端(浏览器)端.这就是代理从浏览器中获取json并将其直接传递给Web API.它还将Web API中的JSON响应直接传递给浏览器,而不进行反序列化.只是一个虚拟代理,它不知道它传输的数据.请建议是否可行,实施它的最佳方法是什么.现有的Web应用程序(用于生成客户端页面的应用程序)是使用ASP.NET MVC 4实现的.

提前致谢.

mci*_*321 9

为之前版本的WebApi写了一个.代码应该很容易为您的目的更新.

基本思想是创建一个WebApi DelegatingHandler,将请求传递给HttpClient:

    public class ForwardProxyMessageHandler : DelegatingHandler
    {
        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            request.Headers.Add("X-Forwarded-For", request.GetClientIp());
            if (request.Method == HttpMethod.Get || request.Method == HttpMethod.Trace) request.Content = null;
            request.RequestUri = new Uri(request.RequestUri.ToString().Replace(":3002", "")); //comes through with the port for the proxy, rewrite to port 80
            request.Headers.AcceptEncoding.Clear();
            var responseMessage = await new HttpClient().SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
            responseMessage.Headers.TransferEncodingChunked = null; //throws an error on calls to WebApi results
            if (request.Method == HttpMethod.Head) responseMessage.Content = null;
            return responseMessage;
        }

    }
Run Code Online (Sandbox Code Playgroud)

  • 人们应该意识到,像提供的示例中那样更新 HttpClient 实例可能会导致问题。来自文档:“HttpClient 旨在实例化一次并在应用程序的整个生命周期中重复使用。为每个请求实例化 HttpClient 类将耗尽重负载下可用的套接字数量。” https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpclient (2认同)