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