使用ChannelFactory <T>创建具有不同凭据的频道

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每个用户名的实例?

Yah*_*hia 7

由于在MSDN上记载,这是不能直接(Credentials变为只读时OpenChannelFactory)......如果你真的想这样做,你需要欺骗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 ......