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

时间:2014-09-11 14:39:59

标签: asp.net-mvc-4 asp.net-web-api

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

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

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

    提前致谢。

1 个答案:

答案 0 :(得分:9)

wrote one for a previous version of 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;
        }

    }