0

私が開発した 4 つの WCF サービスがあります。

各サービスは別の役割を果たします。

各サービスにはUserNamePasswordValidatorがあるため、クライアントは接続時に資格情報を提供する必要があります。

MVVM アーキテクチャで WPF クライアント アプリケーションを開発したいと考えています。

「ログイン」画面でWPF アプリケーションをロードしたいのですが、

ユーザーがユーザー名とパスワードを入力する場所

そして、これは 4 つの WCF サービスの 4 つのクライアントに渡されます (すべて同じユーザー名とパスワードを使用します)。

これを行うための最良のアプローチは何ですか?

クライアントはどこにありますか? 「モデル」部分で?どのビューのモデルですか?

WCF サービスは複数のビューで使用する必要があるため、特定のモデル クラスに WCF サービス クライアントを配置することはできないと思います...

4

1 に答える 1

1

これを行うために、エンドポイントと適切なIClientChannel派生インターフェースを指定してサービスに接続する ServiceFactory クラスを作成しました。これは、クライアント チャネルの作成ごとにユーザー名とパスワードの値を設定する必要があるため、VS で生成されたプロキシ経由ではなく、WCF サービスを直接使用していることを前提としています。

クライアント チャネル インターフェイスは、サービス ファクトリと共に外部の "サービス ライブラリ" にあるため、WCF サービスの実装およびクライアントと共有できます。クレデンシャルは静的な状態ディクショナリに保存されます (ただし、たとえば、メイン リソース ディクショナリにも配置されます)。パスワードは、SecuredStringセキュリティを少し強化するために に保存されます。

このようなサービス ファクトリを作成するための基本的なプロセスについては、ブログで説明しました。

http://blog.kutulu.org/2012/03/proxy-free-wcf-ditching-proxy.html

私たちの場合、資格情報の入力を求めるセットアップ ルーチンを実行し、App.xaml.csサービスの 1 つを呼び出して、ログインが成功するまでループします。そのコードははるかに複雑ですが、基本的には次のとおりです。

while (true)
{
  var factory = new ChannelFactory<ITestChannel>(new WSHttpBinding("SecuredBinding"));
  ITestChannel client = null;
  try
  {
    factory.Credentials.UserName.UserName = logOnModel.UserName;
    factory.Credentials.UserName.Password = logOnModel.Password;

    var address = Settings.Default.TestServiceUrlBase));
    client = factory.CreateChannel(address);

    break;
  }
  // Catch various exceptions here.
}

ここでの秘訣は、ログインまたはパスワードが間違っていUsernamePasswordValidatorてログインに失敗した場合MessageSecurityException、チャンネルに障害が発生するため、チャンネルを閉じて新しいチャンネルを開く必要があるということです。ChannelFactoryただし、最初のチャネルを開いたら資格情報を変更することはできないため、毎回新しいファクトリと新しいクライアント チャネルを破棄して再作成する必要があります。

また、URL が間違っている場合に備えてCommunicationException、ここでもチェックします。ArgumentException

それが完了したら、サービス ファクトリ クラスで同様のコードを使用して、チャネル インターフェイスを指定してクライアントを構築し、各呼び出しの資格情報を設定できます。(実際には、チャネルを頻繁に作成および破棄するため、個別のインターフェイスごとにサービス ファクトリをキャッシュしますが、それはあなた次第です。)

于 2012-07-09T13:40:49.387 に答える