質問

IISでホストされ、HTTPトランスポートを使用し、サーバーのメモリに状態を保持するWCFサービスを作成する必要があります。 Stateful Servicesは良い考えではないことを知っていますが、この最後の制約は、サービスをレガシークライアントと連携させるために必要です。

私の最初の考えは、値を保存するためにASP.NETのセッションでした。サービスでASP.NET互換モードをアクティブにしたため、HTTPContextにアクセスできましたが、セッションオブジェクトに配置された値はメモリに持続していませんでした。これは、セッション状態を処理するHTTPモジュールが正しく構成されていないためだと思いますが、回答のためにグーグルで検索したとき、WCFセッションであり、それらを使用する方が良いと思ったからです。

ただし、WCFセッションは、以下のドキュメントとサービスに不思議な一連のセットを置いているように見えます。自分のニーズに合った構成を見つけることができませんでした。クライアントとサーバーは同じドメインの一部ではないため、Windows認証に返信します。私はこれをwshttpbindingを使用して進めようとしています、私はWCFセッションがセキュリティまたは信頼できるメッセージのいずれかを必要とすることを聞いていましたが、次のとおりです。サービスの例外によって認証されませんでした。これは、Windowsセキュリティを使用していたため、かなり論理的です。

  • セキュリティが完了した場合、「契約にはセッションが必要ですが、「wshttpbinding」をサポートしていないか、サポートするように適切に構成されていない」で失敗します。

  • セキュリティを無効にしている間、信頼できるメッセージを有効にしている場合、例外を取得します。WSHTTPBindingが輸送セキュリティ(HTTPS)を介した信頼できるセッションをサポートしていないため、バインディング検証は失敗しました。チャネル工場またはサービスホストを開くことができませんでした。 HTTPを介した安全な信頼できるメッセージングにメッセージセキュリティを使用してください。」

  • 輸送レベルのセキュリティを有効にしようとしましたが、これは生成されたエラーに違いをもたらさないようです

私に役立つ可能性のある構成はありますか?または、ASP.NETセッションを使用する計画に戻る必要がありますか?

役に立ちましたか?

解決

WCFは、セッション情報を非常に簡単な方法でメモリに保持することができます。私の指示で可能な外部の影響を排除するために、私はあなたが真新しいプロジェクトから始めていると仮定します:

  1. 新しいWCFサービスライブラリプロジェクトを作成します。このプロジェクトには、aでサービスが既に含まれています WSHttpBiding バインディング先入観。
  2. サービス契約(ISERVICE1.CS)に移動し、ServiceContract属性を以下に変更します。

    [ServiceContract(SessionMode = SessionMode.Required)]
    
  3. サービスインプメーション(Service1.cs)に移動し、次のServiceBehavior属性をサービスクラスに追加します(Service1):

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single)]
    
  4. セッションデータをサービスクラスのメンバーとして追加します(Service1):

    public class Service1 : IService1
    {
        ...
    
        private string UserFullName { get; set; }
    
        ...
    }
    
  5. メンバーを使用してセッション特定のデータを提示します(サービス契約にも追加することを忘れないでください。 IService1):

    public class Service1 : IService1
    {
        ...
    
        public string Welcome(string fullName)
        {
            UserFullName = fullName ?? "Guest";
            return string.Format("Welcome back, {0}!", UserFullName);
        }
    
        public string Goodbye()
        {
            return string.Format("Come back soon, {0}!", UserFullName ?? "Guest");
        }
    
        ...
    }
    

SessionMode.Required クライアントがセッション追跡されるようにします。
InstanceContextMode.PerSession サービスクラス(Service1)のインスタンスがすべてのセッションに対して作成され、セッションデータを保持できるようにし、同じセッションで複数の呼び出しにわたってメモリに存在します。
ConcurrencyMode.Single 各サービスクラスインスタンス(Service1)を入力できるスレッドは1つだけで、サービスクラス(および外部スレッドセーフロケーション)のデータのみにアクセスすると、可能な並行性の問題を防ぎます。

編集: デフォルトでは、 WSHttpBinding セキュリティセッションのみを許可します。しかし、セキュリティを有効にしないセッションを確立できる信頼できるセッションもサポートしています。次のバインディング構成により、セキュリティが無効になり、信頼できるセッションが可能になります。

<wsHttpBinding>
    <binding name="wsHttpBindingConfiguration">
        <security mode="None" />
        <reliableSession enabled="true" />
    </binding>
</wsHttpBinding>

他のヒント

IMOこれは、WCFのようなHTTPを介して不十分な抽象化を伴うテクノロジーを使用しているときに起こることです。 WCF Webサービスを理論的にHTTPなしでホストできるという事実(つまり、Net TCP、MSMQなど)は、構成HELLに入り、正しい構成の推測を開始することなく、HTTPの組み込み機能を使用するのが難しくなります。トライアルアンドエラーによる「可能なすべての構成順列を試してみると、正しいものが見つかるまで!

最終的に、WCFを使用できず、Webサービスをゼロから実装しなければならなかった場合、クライアントが正常に認証されたときにCookieを設定するだけです。その後、すべてのクライアントリクエストで、そのCookieが参照されるセッション情報を手に入れるだけです。

WCFを使用する必要がある場合に可能な解決策の1つは、セッション管理を自分の手で取ることです (それは、何かを機能させるために必要な努力に不満を抱いているときに私がしていることです) また、セッション/認証を必要とするすべてのWebサービス(通常、認証時に生成されるGUID)に明示的な「セッション」プロパティを持っています。そのため、後続の各リクエストについて、GUIDを使用して、そのクライアントに関連付けられたセッション情報を再水和します。

別のWebサービスフレームワークを試してみたい場合は、 オープンソースWebサービスフレームワーク これにより、構成のない、ドライ、テスト可能なWebサービスを構築できます。これにより、作成する各Webサービスは、XML、JSON、JSV、SOAP 1.1、SOAP 1.2エンドポイントで自動的にアクセスできます。効果的に、休憩中のクライアントと簡単なデバッグとSOAPエンドポイント(一部の企業によって義務付けられている人気のある選択肢)のHTTP Get URLを介して同じWebサービスにアクセスできます。 こんにちは世界 チュートリアルでは、その機能のいくつかとその仕組みに関する適切な概要を説明する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top