簡體   English   中英

C# Web 應用程序 -> 代理所有請求 -> 從另一個 Web 應用程序返回內容(反向代理)

[英]C# web application -> proxy all requests -> return content from another web application (Reverse proxy)

我想將每個請求代理到一個 Web 應用程序,將它傳遞給另一個 Web 應用程序,然后將我的其他 Web 應用程序響應返回給原始發件人。

它應該能夠處理所有http methodscontent-types等。我還應該能夠編輯傳入的請求並添加額外的標頭和內容。

這樣做的背景是一個項目的安全架構,該項目在公共 DMZ 中有一個 Web 服務器,然后在內部網絡中有另一個允許與數據庫服務器通信的 Web 服務器。

在此處輸入圖片說明

為 ASP.NET 核心找到了一個線程,但最好使用 .Net Framework 來完成,而不是依賴於外部庫。

使用 Asp.net 核心創建到另一個 Web api 的代理

為 Web API 找到了一個很好的答案,使我朝着正確的方向前進。

https://stackoverflow.com/a/41680404/3850405

我首先添加了一個新的 ASP.NET Web 應用程序 -> MVC -> 無身份驗證。

然后我刪除了所有接受Global.asaxpackages.configWeb.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM