2016-09-23 4 views
2

私はいくつかの異なるサーバーのメッシュで、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はそれをすることができません。 – Liam

+0

これは単純化されたユースケースです。現実の世界では裏で認証があります。 –

+1

ロードバランサまたはリバースプロキシそれはかなり標準的なセットアップであり、ほとんどのCOTS製品は、トークンを渡すなど、認証に対処できなければなりません。 Microsoft ISAは1つで、ADなどとうまく統合されています。 – ADyson

答えて

2

SilverlightソリューションのC#コードでこれを一度行う必要がありました。それはかわいそうではなかった。

リバースプロキシアプリケーションリクエストルーティングとしたいものです。

最初に、リバースプロキシソリューション...比較的単純です。

IISの下でweb.configを使用してリバースプロキシを作成するためのガイドは、Scott ForsythCarlos Aguilar Maresです。 ここにあるのはa moduleあなたが通常の解決策が気に入らなければ、Paul Johnstonという名前の男が書いたものです。これらはすべてIISに焦点を当てています。

非IISリバースプロキシは、ロードバランシングの方が一般的です。通常は、Apacheベースのまたは独自のハードウェアです。彼らは自由から高価なボールまで様々です。 スラングを許してください。

クライアントのパースペクティブの一貫性を維持するには、リバースプロキシ設定以上のものが必要です。したがって、純粋なリバースプロキシルートを下る前に、いくつかの考慮事項があります。

サーバーでは、ビューステートとその他のものを同期させるためにMachine Keysを共有し、Session Storeも共有する必要があります。

これは十分なものではない場合は、Application Request Routing(サーバーアフィニティを検索)によってセッションスティッキーを実装し、特定のセッションCookie(またはIPアドレス、またはトークンクッキーを生成する可能性があります)要求ごとに同じサーバー。

0

私はasp.net/web api用のシンプルで強力なリバースプロキシも作成しました。それはまさにあなたが必要とするものです。 https://github.com/SharpTools/SharpReverseProxy

ちょうどnuget経由でプロジェクトに追加し、あなたが行ってもいいです:

あなたはここでそれを見つけることができます。要求や応答を即座に変更したり、認証に失敗したために転送を拒否することもできます。

ソースコードを見てみると、実装がとても簡単です。

関連する問題