2013-08-13 12 views
9

マルチテナントのServiceStackを使用してAPIを作成しています。私たちはリバースプロキシ(nginxやhaproxyのようなもの)を使って物を編み上げるのではなく、DNSベースのロードバランシングとルーティングをしたいと思っています。マルチテナントServiceStack API、異なるホスト名の要求に応答する同じデプロイメント?

テナントパラメータを持つRequest DTOがあります。 ServiceStack(およびそのSwaggerFeature)を使用すると、カスタムルートを定義し、パス、クエリ、ヘッダー、または本文から値を読み取ることができるようにDTOを文書化できます。

DTOプロパティーもホスト名パターンから値を読み取ることができるように、私たちはどのように配線しますか?ですから、ルートとホスト名の一致から値を取るようにしますか?我々はまた、

  • https://{tenant}.{DNS zone for environment}/{rest of path with tokens}

のようなURL持っているしたいと思います

- DNSゾーンアウトは、私たちがしているどの環境によって異なります - 非生産我々が使用するために(例えば)testing-foobar.com生産はreal-live.comです。理想的には、単一のルート宣言で両方をサポートすることができます(実行時に命令型宣言の代わりにリクエストDTOを装飾する方が好ましい場合はAppHost.Init)。

+1

私の最初の傾向は、[リクエストとレスポンスのフィルタ](https://github.com/ServiceStack/ServiceStack/wiki/Request-and-response-filters)を使用することです。 –

+4

私は 'Tenant'プロパティを持つカスタムの' ITenant'インターフェースを実装しているリクエストDTOを注入するリクエストフィルタを使用したいと思います。別の解決策は、AbsoluteUriまたはRawUrlプロパティを検査するすべてのサービス内で再利用できる 'IHttpRequest.Tennant()'拡張メソッドを使用することです。 – mythz

+0

@mythz - これをServiceStackでどのように実装するかの例がありますか? – Marek

答えて

3

.NETセキュリティプリンシパルを使用してユーザーのアクセス許可とテナントを処理する既存のマルチテナントシステムで、今週のところこれを解決しました。カスタムServiceRunnerを使用してテナントを選択し、セキュリティを設定しました。マルチテナントへのアプローチは異なりますが、ServiceRunnerを使用することは有効なアプローチのようです。

あなたはこのようなものに終わるだろう:

public class MyServiceRunner<T> : ServiceRunner<T> 
{ 
    public MyServiceRunner(IAppHost appHost, ActionContext actionContext) 
     : base(appHost, actionContext) 
    {} 

    public override void BeforeEachRequest(IRequestContext requestContext, T request) 
    { 
     // Set backend authentication before the requests are processed. 
     if(request instanceof ITenantRequest) 
     { 
      Uri uri = new Uri(requestContext.AbsoluteUri); 
      string tenant = uri.Host; // Or whatever logic you need... 
      ((ITenantRequest).Tenant = tenant; 
     } 
    } 
} 

public class MyAppHost : AppHostBase 
{ 
    public MyAppHost() : base("My Web Services", typeof(MyService).Assembly) { } 

    public override IServiceRunner<TRequest> CreateServiceRunner<TRequest>(ActionContext actionContext) 
    { 
     return new MyServiceRunner<TRequest>(this, actionContext); 
    } 

    public override void Configure(Container container) 
    { 
     ... 
    } 
} 

おそらく、要求のフィルタリングアプローチは何とか良いですが、これが私たちのために仕事をしていません。

+0

UnitOfWorkを実行するためのIServiceRunnerが既に用意されています。これらは連鎖可能ではないと思います –

関連する問題