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

C#web应用程序->;代理所有请求->;从另一个web应用程序返回内容(反向代理),c#,asp.net,asp.net-mvc,asp.net-web-api,proxy,C#,Asp.net,Asp.net Mvc,Asp.net Web Api,Proxy,我想将每个请求代理给一个web应用程序,将其传递给另一个web应用程序,然后将我的其他web应用程序响应返回给原始发件人 它应该能够处理所有http方法和内容类型等。我还应该能够编辑传入请求并添加额外的标题和内容 这样做的背景是一个项目的安全体系结构,该项目在公共DMZ中有一个web服务器,然后在允许与数据库服务器对话的内部网络中有另一个web服务器 为ASP.NET core找到了一个线程,但最好使用.NET Framework完成,而不依赖于外部库 为Web API找到了一个很好的答案,使

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

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

这样做的背景是一个项目的安全体系结构,该项目在公共DMZ中有一个web服务器,然后在允许与数据库服务器对话的内部网络中有另一个web服务器

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


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

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

然后我删除了accept
Global.asax
packages.config
Web.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;
    }
}
公共类MVCAPApplication:System.Web.HttpApplication
{
受保护的无效应用程序\u Start()
{
配置(CustomHttpProxy.Register);
}
}
公共静态类CustomHttpProxy
{
公共静态无效寄存器(HttpConfiguration配置)
{
config.Routes.MapHttpRoute(
名称:“代理”,
routeTemplate:“{*path}”,
处理程序:HttpClientFactory.CreatePipeline(
innerHandler:new HttpClientHandler(),
处理程序:新的DelegatingHandler[]
{
新的ProxyHandler()
}
),
默认值:new{path=RouteParameter.Optional},
约束:null
);
}
}
公共类代理处理程序:DelegatingHandler
{
私有静态HttpClient=新HttpClient();
受保护的覆盖异步任务SendAsync(
HttpRequestMessage请求,
取消令牌(取消令牌)
{
var forwardUri=新的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=wait client.sendaync(请求,HttpCompletionOption.ResponseHeadersRead);
返回响应;
}
}
在这之后,我不得不添加静态内容,然后一切工作


你的问题是什么?如果您只想逐字地传递请求和响应,那么您不需要另一个应用程序,只需要一个通用网关服务器,我想。如果需要,这些工具可能会添加额外的标题等。@ADyson我需要能够向请求添加额外的标题和内容,请参见第二段。是的,我相信一些网关软件可以做到这一点。再说一次,你的问题是什么?还有,为什么您需要传递请求?这个“客户端门户”是API还是GUI?它听起来像一个GUI。所以用户向GUI发出请求,GUI向API发出请求……听起来很标准?@ADyson如果这个问题问得不好,我很抱歉。我自己找到了答案,但请求通过的原因是我需要为每个请求添加一个证书。无法在GUI中处理此问题,因为客户端将有权访问此证书。“无法在GUI中处理此问题,因为客户端将有权访问此证书。”如果GUI的后端(即服务器端代码)正在发出请求,则无法处理此问题。无论如何,很高兴你找到了解决方案。谢谢你的回答-非常有用!但是,我必须得到这个软件包:Microsoft.AspNet.WebApi.WebHost