繁体   English   中英

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

[英]C# web application -> proxy all requests -> return content from another web application (Reverse proxy)

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

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

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

在此处输入图片说明

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

使用 Asp.net 核心创建到另一个 Web api 的代理

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

https://stackoverflow.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;
    }
}

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

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM