【问题标题】:"transparent" server side proxy for requests to ASP.NET Web API对 ASP.NET Web API 的请求的“透明”服务器端代理
【发布时间】:2021-09-08 21:10:57
【问题描述】:

拥有一个生成 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 实现的。

提前致谢。

【问题讨论】:

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


    【解决方案1】:

    2021 年更新:

    如果你在这里找到了自己的方式,你可能应该看看https://microsoft.github.io/reverse-proxy/

    旧答案:

    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;
            }
    
        }
    

    【讨论】:

    • 您如何将其合并到特定路径的 Web api 控制器中?
    • 我认为您只需单独注册它的路由,而不是作为任何其他控制器的一部分。
    • 其他人是否会为任何 url 返回 404?
    • 人们应该知道,像在提供的示例中所做的那样更新 HttpClient 实例可能会导致问题。来自文档:“HttpClient 旨在实例化一次并在应用程序的整个生命周期中重复使用。为每个请求实例化 HttpClient 类将耗尽重负载下可用的套接字数量。” docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient
    • @Asher 我收到 PUT/DELETE 方法返回的 404; GET/POST 按预期命中委托处理程序。我在同一个应用程序的其他地方使用 PUT/DELETE,它只是调用透明服务器端代理来获取这些 HTTP 动词的 404。
    猜你喜欢
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 2011-02-07
    相关资源
    最近更新 更多