我想将每个请求代理到Web应用程序,将其传递给另一个Web应用程序,然后将我的其他Web应用程序响应返回给原始发件人。
它应该能够处理所有content-types
和Web Performance and Load Test Project
等。我还应该能够编辑传入的请求并添加其他标题和内容。
执行此操作的背景是项目的安全体系结构,该项目在公共DMZ中具有一个Web服务器,然后允许内部网络中的另一个Web服务器与数据库服务器通信。
找到一个ASP.NET核心的线程,但最好是使用.Net Framework完成,而不依赖于外部库。
答案 0 :(得分:0)
为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;
}
}
在此之后我不得不添加静态内容,然后一切正常。