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

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

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

它应该能够处理所有http方法内容类型等。我还应该能够编辑传入的请求并添加额外的 header 和内容。

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

enter image description here

找到了 ASP.NET core 的线程,但最好应该使用 .Net Framework 来完成,而不是依赖于外部库。

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

最佳答案

找到了 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

关于C# Web 应用程序 -> 代理所有请求 -> 从另一个 Web 应用程序返回内容(反向代理),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48424510/

相关文章:

c# - 如何允许与 Dynamics 服务器的一般连接

c# - WPF 应用程序与 Winforms 应用程序有什么区别?

c# - 将选择的文件提升到 IIS7 站点

c# - 如何从线程内部更新字符串值

c# - 在 ASP.NET 的 IdentityUserRole 2.0 中获取角色名称

Javascript 无法在 IIS7.5 上的网站内运行 - Windows Server 2008 R2

asp.net - Jquery 列表框/文本框过滤器

mysql - 如何将字符串转换为日期

asp.net-mvc - 使用Razor View 引擎输出Json

javascript - 如何 "playback"用户输入的内容 - MVC