我已经开发了4项WCF服务。
每个服务都负责其他一些事情。
每个服务都有一个UserNamePasswordValidator,因此客户端在连接时需要提供凭据。
现在我想在MVVM架构中开发我的WPF客户端应用程序。
我希望WPF应用程序加载一个‘登录’屏幕,
其中,用户将输入用户名和密码,
然后,这将传递给4 WCF服务的4个客户端(都使用相同的用户名和密码)。
做这件事的最佳方法是什么?
客户在哪里?在“模特”那部分?哪个视图的模型?
WCF服务需要被多个视图使用,所以我认为我不能将任何WCF服务客户端放在特定的Model类中.
发布于 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中执行一个安装例程,它提示输入凭据并尝试调用我们的服务之一,循环操作直到成功登录。这段代码要复杂得多,但基本上是:
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上的凭据,所以每次都需要释放和重新创建一个新的工厂和新的客户端通道。
我们还在这里检查CommunicationException和ArgumentException,以防网址错误。
一旦完成,您就可以在服务工厂类中使用类似的代码来构造一个客户端,给出它的通道接口,并为每个调用设置凭证。(我们实际上为每个不同的接口缓存服务工厂,因为我们经常创建和销毁通道,但这取决于您。)
https://stackoverflow.com/questions/11396037
复制相似问题