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

时间:2018-01-24 14:11:54

标签: c# asp.net asp.net-mvc asp.net-web-api proxy

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

它应该能够处理所有content-typesWeb Performance and Load Test Project等。我还应该能够编辑传入的请求并添加其他标题和内容。

执行此操作的背景是项目的安全体系结构,该项目在公共DMZ中具有一个Web服务器,然后允许内部网络中的另一个Web服务器与数据库服务器通信。

enter image description here

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

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

1 个答案:

答案 0 :(得分:0)

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

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

enter image description here