0

我已经开发了 4 个 WCF 服务。

每个服务都负责其他事情。

每个服务都有一个UserNamePasswordValidator,因此客户端在连接时需要提供凭据。

我现在想在 MVVM 架构中开发我的 WPF 客户端应用程序。

我希望 WPF 应用程序加载“登录”屏幕,

用户将在其中输入用户名和密码,

然后这将被传递给 4 个 WCF 服务的 4 个客户端(都使用相同的用户名和密码)。

这样做的最佳方法是什么?

客户在哪里?在“模型”部分?哪个视图的模型?

WCF 服务需要被多个视图使用,所以我认为我不能将任何 WCF 服务客户端放在特定的模型类中......

4

1 回答 1

1

为此,我们创建了一个 ServiceFactory 类,该类连接到给定端点和适当的IClientChannel派生接口的服务。这假设您直接使用 WCF 服务,例如,不是通过 VS 生成的代理,因为您需要在每个客户端通道创建时设置用户名和密码值。

客户端通道接口与服务工厂一起位于外部“服务库”中,因此它们可以与 WCF 服务实现和客户端共享。我们将凭据存储在静态字典中(尽管您也将其放入主资源字典中),密码保存在 aSecuredString中以提供一点额外的安全性。

我已经通过博客描述了创建这样一个服务工厂的基本过程:

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

在我们的例子中,我们执行一个设置例程App.xaml.cs,提示输入凭据并尝试调用我们的服务之一,循环直到我们成功登录。该代码要复杂得多,但基本上是:

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 回答