C# Web 应用程序 -> 代理所有请求 -> 从另一个 Web 应用程序返回内容(反向代理)

Posted

技术标签:

【中文标题】C# Web 应用程序 -> 代理所有请求 -> 从另一个 Web 应用程序返回内容(反向代理)【英文标题】:C# web application -> proxy all requests -> return content from another web application (Reverse proxy) 【发布时间】:2018-07-03 14:50:09 【问题描述】:

我想将每个请求代理到 Web 应用程序,将其传递给另一个 Web 应用程序,然后将我的其他 Web 应用程序响应返回给原始发件人。

它应该能够处理所有http methodscontent-types 等。我还应该能够编辑传入的请求并添加额外的标头和内容。

这样做的背景是一个项目的安全架构,该项目在公共 DMZ 中有一个 Web 服务器,然后在内部网络中有另一个 Web 服务器允许与数据库服务器通信。

为 ASP.NET 核心找到了一个线程,但最好使用 .Net Framework 完成,而不是依赖于外部库。

Creating a proxy to another web api with Asp.net core

【问题讨论】:

你有什么问题?如果您只想逐字传递请求和响应,您不需要另一个应用程序,只需一个通用网关服务器,我会想到。如果需要,这些工具可能会添加奇怪的额外标题等。 @ADyson 我需要能够为请求添加额外的标头和内容,请参阅第二段。 是的,我相信一些网关软件可以做到这一点。但同样,您的问题是什么?另外,为什么您需要传递请求?这个“客户端门户”是 API 还是 GUI?它听起来像一个图形用户界面。所以用户向 GUI 发出请求,GUI 向 API 发出请求……听起来很标准? @ADyson 如果问题问得不好,我很抱歉。我自己找到了答案,但请求通过的原因是因为我需要为每个请求添加证书。这无法在 GUI 中处理,因为这样客户端就可以访问此证书。 "这不能在 GUI 中处理,因为这样客户端就可以访问这个证书。"如果 GUI 的后端(即服务器端代码)正在发出请求,则不会。无论如何,很高兴您找到了解决方案。 【参考方案1】:

为 Web API 找到了一个很好的答案,让我朝着正确的方向前进。

https://***.com/a/41680404/3850405

我首先添加了一个新的 ASP.NET Web 应用程序 -> MVC -> 无身份验证。

然后我删除了所有接受Global.asaxpackages.configWeb.config

然后我编辑了Global.asax 以使用DelegatingHandler,如下所示:

public class MvcApplication : System.Web.HttpApplication

    protected void Application_Start()
    
        GlobalConfiguration.Configure(CustomHttpProxy.Register);
    


public static class CustomHttpProxy

    public static void Register(HttpConfiguration config)
    
        config.Routes.MapHttpRoute(
            name: "Proxy",
            routeTemplate: "*path",
            handler: HttpClientFactory.CreatePipeline(
                innerHandler: new HttpClientHandler(),
                handlers: new DelegatingHandler[]
                
                    new ProxyHandler()
                
            ),
            defaults: new  path = RouteParameter.Optional ,
            constraints: null
        );
    


public class ProxyHandler : DelegatingHandler

    private static HttpClient client = new HttpClient();

    protected override async Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request,
        CancellationToken cancellationToken)
    
        var forwardUri = new UriBuilder(request.RequestUri.AbsoluteUri);
        forwardUri.Host = "localhost";
        forwardUri.Port = 62904;
        request.RequestUri = forwardUri.Uri;

        if (request.Method == HttpMethod.Get)
        
            request.Content = null;
        

        request.Headers.Add("X-Forwarded-Host", request.Headers.Host);
        request.Headers.Host = "localhost:62904";
        var response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
        return response;
    

在此之后,我必须添加静态内容,然后一切正常。

【讨论】:

感谢您的回答 - 非常有帮助!不过,我不得不 Nuget 这个包:Microsoft.AspNet.WebApi.WebHost

以上是关于C# Web 应用程序 -> 代理所有请求 -> 从另一个 Web 应用程序返回内容(反向代理)的主要内容,如果未能解决你的问题,请参考以下文章

HTTP协议图--与 HTTP 协作的 Web 服务器

fiddler工作原理和代理设置

在 C# 中使用 Post 方法 HttpClient 时请求超时

Fiddler - 免费的Web调试代理

web服务器请求代理方式

强制在来自 NET Web 服务代理类的 SOAP 请求中包含默认值属性属性