[英]C# web application -> proxy all requests -> return content from another web application (Reverse proxy)
我想将每个请求代理到一个 Web 应用程序,将它传递给另一个 Web 应用程序,然后将我的其他 Web 应用程序响应返回给原始发件人。
它应该能够处理所有http methods
和content-types
等。我还应该能够编辑传入的请求并添加额外的标头和内容。
这样做的背景是一个项目的安全架构,该项目在公共 DMZ 中有一个 Web 服务器,然后在内部网络中有另一个允许与数据库服务器通信的 Web 服务器。
为 ASP.NET 核心找到了一个线程,但最好使用 .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;
}
}
在此之后,我必须添加静态内容,然后一切正常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.