[英]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.