Ada*_*son 3 .net wcf channelfactory
我使用该ChannelFactory<T>类型在WsHttpBindingWCF Web服务中创建通道,该服务使用用户名/密码组合进行身份验证.虽然我使用自定义验证器进行身份验证,但我在创建具有不同凭据的频道时遇到了困难.
鉴于创建的开销ChannelFactory<T>,我正在尝试缓存它的单个实例并共享它,以便在我的应用程序的生命周期内创建多个通道.不幸的是,似乎凭证直接与工厂绑定,并且在创建通道后无法更改.
换句话说,如果我试试这个:
factory.Credentials.UserName.UserName = "Bob";
factory.Credentials.UserName.Password = "password";
var channel1 = factory.CreateChannel();
factory.Credentials.UserName.UserName = "Alice"; // exception here
factory.Credentials.UserName.Password = "password";
var channel1 = factory.CreateChannel();
Run Code Online (Sandbox Code Playgroud)
我得到一个例外,告诉我该UserName属性现在是只读的.
是否有可能在这里实现任何类型的缓存,或者我基本上必须缓存ChannelFactory每个用户名的实例?
由于在MSDN上记载,这是不能直接(Credentials变为只读时Open的ChannelFactory)......如果你真的想这样做,你需要欺骗ChannelFactory是这样的:
// step one - find and remove default endpoint behavior
var defaultCredentials = factory.Endpoint.Behaviors.Find<ClientCredentials>();
factory.Endpoint.Behaviors.Remove(defaultCredentials);
// step two - instantiate your credentials
ClientCredentials loginCredentials = new ClientCredentials();
loginCredentials.UserName.UserName = "Username";
loginCredentials.UserName.Password = "Password123";
// step three - set that as new endpoint behavior on factory
factory.Endpoint.Behaviors.Add(loginCredentials); //add required ones
Run Code Online (Sandbox Code Playgroud)
另一种选择似乎是Close()在ChannelFactory试图改变之前Credentials.
否则只需坚持为不同的凭据缓存不同的ChannelFactories ......
| 归档时间: |
|
| 查看次数: |
3654 次 |
| 最近记录: |