我想代理对 Web 应用程序的每个请求,将其传递给另一个 Web 应用程序,然后将其他 Web 应用程序响应返回给原始发件人。
它应该能够处理所有http方法
和内容类型
等。我还应该能够编辑传入的请求并添加额外的 header 和内容。
这样做的背景是一个项目的安全架构,该项目在公共(public) DMZ 中拥有一台 Web 服务器,然后在内部网络中拥有另一台允许与数据库服务器通信的 Web 服务器。
找到了 ASP.NET core 的线程,但最好应该使用 .Net Framework 来完成,而不是依赖于外部库。
最佳答案
找到了 Web API 的一个很好的答案,它引导我走向正确的方向。
https://stackoverflow.com/a/41680404/3850405
我首先添加一个新的 ASP.NET Web 应用程序 -> MVC -> 无身份验证。
然后,我删除了接受 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;
}
}
在此之后,我必须添加静态内容,然后一切正常。
关于C# Web 应用程序 -> 代理所有请求 -> 从另一个 Web 应用程序返回内容(反向代理),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48424510/