【问题标题】:Using ChannelFactory<T> To Create Channels with Different Credentials使用 ChannelFactory<T> 创建具有不同凭据的通道
【发布时间】:2011-10-11 15:56:36
【问题描述】:

我正在使用ChannelFactory&lt;T&gt; 类型将通道创建到WsHttpBinding WCF Web 服务中,并且该服务使用用户名/密码组合进行身份验证。虽然我使用自定义验证器进行身份验证,但在创建具有不同凭据的通道时遇到了困难。

考虑到创建ChannelFactory&lt;T&gt; 的开销,我试图缓存它的单个实例并共享它,以便在我的应用程序的生命周期内创建多个通道。不幸的是,凭据似乎直接与工厂绑定,并且在创建通道后无法更改。

换句话说,如果我尝试这个:

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();

我收到一个异常,告诉我 UserName 属性现在是只读的。

是否可以在这里实现任何类型的缓存,还是我必须为每个用户名缓存一个 ChannelFactory 实例?

【问题讨论】:

    标签: .net wcf channelfactory


    【解决方案1】:

    As documented on MSDN 这是不可能的(CredentialsChannelFactoryOpen 上变为只读)...如果你真的想这样做,你需要像这样欺骗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
    

    在尝试更改 Credentials 之前,另一个选项似乎是 Close() ChannelFactory

    否则,只需为不同的凭据缓存不同的 ChannelFactories...

    【讨论】:

    • 感谢您的回答。我最终只是创建了新工厂而不是处理它。
    • 如何在代码中做到这一点?
    • 如果你可以访问 Juval Lowy 的 ServiceModelEx 库,你可以调用 factory.SetCredentials(domain, username, password) ,它显然和上面的代码做同样的事情。如果你能得到密码,它就像一个魅力。这是我目前的任务。
    【解决方案2】:

    您需要创建一个新的通道工厂。当工厂创建第一个通道时,它的属性变为只读(有些会抛出异常,如您所见;有些则更糟,您更改但没有任何反应,例如,如果您更改传递给的绑定元素中的某些属性CF 构造函数)。

    【讨论】:

      猜你喜欢
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 2010-10-17
      • 2016-10-11
      • 2011-01-15
      相关资源
      最近更新 更多