5

asp.net MVC Webサイト(Asp.Net MVC Webサイトでの状態の維持)にServiceStackを使用することについてアドバイスを受けた後、プロジェクトに実装し始めましたが、まだ不明な点がいくつかあります。

現在、2つのプロジェクトがあります。1つはasp.net MVCプロジェクトで、もう1つはBLプロジェクト(すべてのビジネスロジックを保持するクラスライブラリ)です。MVCプロジェクトのすべてのコントローラーは、BLプロジェクトのクラス/関数を呼び出します。
今のところ、mvcプロジェクトはBLのDLLをロードしますが、将来Webサイトが拡大すると、BLのプロジェクトは別のマシンで実行されます。

セッションの管理/キャッシュと認証にServiceStackを使用したいと思います(どちらも通常は相互に依存していました)。

私の質問:
1)メッセージベースのWebサービスの機能なしで、これら2つの機能のみを使用することは可能ですか?ServiceStackを初期化する必要があり、2回初期化すると(両方のプロジェクトで)エラーが発生します。
2)ServiceStackの実装を2つのプロジェクトに分割することは可能ですか?ServiceStackの認証プロバイダーを使用してBLプロジェクトで認証のプロセスを維持したいのですが、mvcプロジェクトですべてのUI / Cookieを自分で(またはServiceStackの助けを借りて)処理します。
3)BLプロジェクトでServiceStackのキャッシュを使用したいのですが、セッションIDを受信するためにいくつかのセッションCookieを維持する必要があると思います。それを行う正しい方法は何ですか?この目的のための組み込みのヘルパー関数はありますか?

前もって感謝します!

4

2 に答える 2

5

1)メッセージベースのWebサービスの機能なしで、これら2つの機能のみを使用することは可能ですか?ServiceStackを初期化する必要があり、2回初期化すると(両方のプロジェクトで)エラーが発生します。

最新のServiceStack.MvcNuGetパッケージをインストールすると、ServiceStackの組み込みプロバイダーへの便利なアクセスを提供するMVCコントローラーであるベースServiceStackControllerを取得できます。必要な依存関係を使用してコントローラーを自動配線する必要がありますが、たとえば、注入されICacheClientます。

ServiceStackのWebFrameworkを使用していない場合でも、AppHostがあると、依存関係を登録するのに便利な場所になります。ServiceStackは、Web.configで指定されたASP.NETのIHttpHandlerマッピングによってトリガーされるため、マッピングが指定されていない場合、ServiceStackを外部から呼び出すことはできませんが、登録された依存関係には、次の方法で内部的にアクセスできます。

var cache = AppHost.Resolve<ICacheClient>(); //Get ICacheClient for SS IOC

2)ServiceStackの実装を2つのプロジェクトに分割することは可能ですか?

AppHostがある場合、(設計上)ホストプロジェクトに複数のインスタンスを含めることはできません。AppHostは、すべてのサービス依存関係を登録し、Webアプリケーション全体に適用される設定を構成する必要があるホストプロジェクトに類似している必要があるためです。またはサービス。

ただし、サービスの実装を複数のアセンブリに分割し、AppHostBaseコンストラクターで指定することにより、ServiceStackにすべてをスキャンさせることができます。例:

public class AppHost : AppHostBase 
{
   public AppHost() : base("My Service", 
     typeof(AServiceInDll1).Assembly, typeof(AServiceInDll2).Assembly/*, etc.*/){}
}

2)続き ServiceStackの認証プロバイダーを使用してBLプロジェクトで認証のプロセスを維持したいのですが、mvcプロジェクトですべてのUI / Cookieを自分で(またはServiceStackの助けを借りて)処理します。

MVCを使用し、ServiceStackで認証する例については、ServiceStack.UseCasesCustomAuthenticationMvcサンプルプロジェクトを参照してください。

3)BLプロジェクトでServiceStackのキャッシュを使用したいのですが、セッションIDを受信するためにいくつかのセッションCookieを維持する必要があると思います。それを行う正しい方法は何ですか?この目的のための組み込みのヘルパー関数はありますか?

他のC#クラスと同じように、 ServiceStackのキャッシングプロバイダーを使用できます。つまり、ビジネスロジックをバインドしICacheClientて、IOCに具体的な実装を挿入します。

セッションの場合、ServiceStack.MvcServiceStackControllerのメソッドを使用しbase.SessionAs<T>セッションにアクセスできます。セッションを保存し直すには、拡張メソッドを使用できます。これらの方法はどちらも、ASP.NETコンテキスト(提供されていない場合はASP.NETのHttpContextシングルトンを使用)が機能する必要がありますが、セッションにアクセスするたびにクライアントに(サーバーによって)追加されるように自動的に指示されるServiceStackのCookieに依存しているためです。 。IHttpRequest.SaveSession()ss-id/ss-pid

ビジネスロジックサービスがASP.NETに依存しないようにする場合はSystem.Web、セッションにアクセスして保存し、コントローラーで実行してビジネスロジックに渡すことをお勧めします。

ServiceStackのセッションがどのように機能するかについての背景情報については、 SessionsWikiページを読むことをお勧めします。

ServiceStackとASP.NETまたはMVC間のASP.NETコンテキストの統合

ServiceStackの拡張メソッドの一部はこれらの組み込み型に依存しているため、ServiceStackとASP.NETまたはMVCの間で高度な統合を行う場合に役立つため、この情報を追加します。

ServiceStack IHttpRequestまたはIHttpResponse(任意のHTTP / Controllerリクエスト内)を次のコマンドで作成できます。

var ssHttpRequest = System.Web.HttpContext.Current.Request.ToRequest();
var ssHttpResponse = System.Web.HttpContext.Current.Response.ToResponse(); 

最後に、次のコマンドを使用して、完全なリクエストコンテキスト(IHttpRequestとIHttpResponseの両方をカプセル化する)を作成できます。

var ssRequestContext = System.Web.HttpContext.Current.ToRequestContext();
于 2013-02-18T20:18:22.880 に答える
2

あなたの質問と、プロジェクトを複数のサーバーに分割する方法を完全に把握しているかどうかはわかりません。私はあなたの質問に答えるために最善を尽くします...

メッセージベースのWebサービスの機能なしで、これら2つの機能のみを使用することは可能ですか?ServiceStackを初期化する必要があり、2回初期化するとエラーが発生します

1つのソリューション(Webプロジェクトに1つ、BLレイヤーに1つ)内でServiceStackの2つのインスタンス(場合によっては2つのWebサイト)を実行しようとしているようです。それは不可能だと思います。BLレイヤーはServiceStackライブラリを共有でき、BLプロジェクトを参照するWebプロジェクト内のライブラリを(AppHost.Configureメソッド内で)構成できます。

ServiceStackの実装を2つのプロジェクトに分割することは可能ですか?

答えはイエスだと思いますが、両方のプロジェクトでServiceStackのインスタンスが1つ使用されているはずです。これにより、プロジェクト間でセッション状態が共有されます。ServiceStackの独自のインスタンスを持つ2つのプロジェクトを持つ方法があるかもしれません... https://github.com/ServiceStack/ServiceStack/wiki/Self-hostingを参照してください。

BLプロジェクトでServiceStackのキャッシングを使用したいのですが、セッションIDを受信するためにいくつかのセッションCookieを維持する必要があると思います。 ServiceStackが両方のプロジェクトで使用されている場合は、UserSession(https://github.com/ServiceStack/ServiceStack/wiki/Sessions)のすべてのセッションデータにアクセスできます。MVCコントローラーがServiceStackControllerから継承する場合は、SessionFeature.GetSessionId()を使用してセッションIDを取得できます。ServiceStackサービス(Serviceを実装するクラス)では、base.Sessionを使用してセッションデータを取得できます。

お役に立てれば。

于 2013-02-18T18:55:34.323 に答える