2016-09-23 60 views
2

我有一個Web應用程序,它是幾個不同服務器的網格,1服務器是處理所有請求外部傳入請求的前端服務器。c#mvc重新路由請求到不同的服務器

因此,這些請求中的一部分將不得不傳遞給不同的服務器,理想情況下,我想要更改的唯一內容就是這些請求的主機和Uri字段。有沒有辦法將整個傳入請求映射到新的傳出請求並只更改幾個字段?

我想是這樣的:

// some controller 
public HttpResponseMessage get() 
{ 
    return this.Request.Rewrite("192.168.10.13/api/action"); 
} 


//extension method Rewrite 
public static HttpResponseMessage Rewrite(this HttpRequestMessage requestIn, string Uri) { 
    HttpClient httpClient = new HttpClient(new HttpClientHandler()); 
    HttpRequestMessage requestOut = new HttpRequestMessage(requestIn.Method, Uri); 
    requestOut.Content = requestIn.Content; 

    var headerCollection = requestIn.Headers.ToDictionary(x => x.Key, y => y.Value); 
    foreach (var i in headerCollection) 
    { 
     requestOut.Headers.Add(i.Key, i.Value); 
    } 

    return httpClient.SendAsync(requestOut).Result; 
} 

我遇到的問題是,這種有問題的整體轉換。如果請求是獲得Content不應設置。標題是不正確的,因爲它也複製東西,如事後不應該觸摸主機等。

有沒有更簡單的方法來做這樣的事情?

+3

你想要一些負載平衡軟件。我不會建議你自己試着在代碼中自己做這種事情。獲得現成的包裝要好得多。 – Liam

+0

@Liam不能這樣做。這是一個簡化的用例。在現實世界中,幕後有一些認證。 –

+1

負載均衡器或反向代理。這是一個非常標準的設置,大多數COTS產品應該能夠處理認證,包括傳遞令牌或其他任何東西。微軟ISA是一個與AD等 – ADyson

回答

2

我不得不在C#代碼中執行一次Silverlight解決方案。這並不漂亮。

你想要什麼叫做反向代理應用程序請求路由

首先,反向代理解決方案......它們相對簡單。

這裏是Scott ForsythCarlos Aguilar Mares指南,用於在IIS下使用web.config創建反向代理。 這裏的a module一些名叫保羅約翰斯頓的傢伙寫道,如果你不喜歡正常的解決方案。所有這些都集中在IIS上。

非IIS反向代理更常見於負載平衡。通常他們是基於Apache或專有硬件。他們從免費到昂貴的球變化。 原諒俚語。

爲了保持客戶端視角的一致性,您可能需要的不僅僅是逆向代理配置。所以,在你走下純粹的反向代理路由之前,有一些考慮因素。

服務器可能需要共享Machine Keys以同步視圖狀態和其他內容,並共享Session Store

如果這不夠一致,您可能需要通過Application Request Routing(查找服務器相關性)實施會話粘性,以便給定的會話cookie(或IP地址,或者可能會生成令牌cookie)將用戶映射到每個請求都使用同一臺服務器。

0

我還爲asp.net/web api寫了一個簡單但強大的反向代理。它完全符合你的需求。

你可以在這裏找到: https://github.com/SharpTools/SharpReverseProxy

剛剛通過的NuGet添加到您的項目,你是好去。您甚至可以即時修改請求,響應或拒絕由於驗證失敗而導致的轉發。

看看源代碼,它的確很容易實現:)

相關問題