首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使WPF MVVM应用程序连接到多个WCF服务?

如何使WPF MVVM应用程序连接到多个WCF服务?
EN

Stack Overflow用户
提问于 2012-07-09 13:29:45
回答 1查看 856关注 0票数 0

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

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

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

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

我希望WPF应用程序加载一个‘登录’屏幕,

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

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

做这件事的最佳方法是什么?

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

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

EN

回答 1

Stack Overflow用户

发布于 2012-07-09 13:40:49

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

客户端通道接口与服务工厂一起位于外部“服务库”中,因此它们可以与WCF服务实现和客户端共享。我们将这些凭据存储在静态状态字典中(例如,您也将其放入主资源字典中),并将密码保存在SecuredString中,以获得少量额外的安全性。

我描述了在blog上创建这样一个服务工厂的基本过程:

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

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

代码语言:javascript
复制
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上的凭据,所以每次都需要释放和重新创建一个新的工厂和新的客户端通道。

我们还在这里检查CommunicationExceptionArgumentException,以防网址错误。

一旦完成,您就可以在服务工厂类中使用类似的代码来构造一个客户端,给出它的通道接口,并为每个调用设置凭证。(我们实际上为每个不同的接口缓存服务工厂,因为我们经常创建和销毁通道,但这取决于您。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11396037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档