2010-03-07 55 views
15

問候,那是什麼,當我嘗試設置憑據爲我廠如下問題:的ChannelFactory證書+對象是隻讀

ChannelFactory<IWCFSeekService> factory = Factory; 
if (factory != null) 
{ 
    factory.Credentials.UserName.UserName = CServiceCredentials.Instance.Username; 
    _Channel = factory.CreateChannel(); 
} 

我得到一個異常對象是隻讀的。它發生在我想設置用戶名時。

回答

23

是的,MSDN documentation是相當清楚的:

C# 
public ClientCredentials Credentials { get; } 

酒店get訪問 - 沒有set訪問 - >是隻讀的。

另外在MSDN文檔:

備註
的ClientCredentials對象存儲 ,如上所述類型的端點行爲並且可以 通過行爲 屬性進行訪問。

的OnOpened方法初始化 只讀拷貝 ClientCredentials的對象爲 工廠。

那麼你在做什麼這裏做?

更新:您不能設置您的客戶端代理應在通道工廠上使用的用戶憑據。看到這個excellent blog post如何做吧 - 一個有點迂迴的:

  • 首先,從工廠
  • 其次刪除默認的終結點行爲,實例化你自己的憑據
  • 第三,設置這些新證書作爲新的端點行爲對工廠

    // 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 = CServiceCredentials.Instance.Username; 
    loginCredentials.UserName.Password = 「Password123″; 
    
    // step three - set that as new endpoint behavior on factory 
    factory.Endpoint.Behaviors.Add(loginCredentials); //add required ones 
    

似乎有點奇怪和複雜的,但似乎是鄰ne和唯一的方式來實現這一點!

+0

好的,我應該把它放在哪裏? – 2010-03-07 20:58:33

+0

但看看我的代碼..首先我創建一個ChannelFactory ..然後我設置憑據。 – 2010-03-07 21:06:35

+0

但我不能像我的_Channel是IWCFSeekFactory類型的 – 2010-03-07 21:10:50

15

要完成這個答案,實際的方式而工作了所有的人都在

http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/4668e261-0fd0-4ca5-91d2-497aa479f2a9/

您不必刪除解釋,但覆蓋發現憑據:

var credentialBehaviour = factory.Endpoint.Behaviors.Find <ClientCredentials>(); 
credentialBehaviour.UserName.UserName = "test"; 
credentialBehaviour.UserName.Password = "test"; 

這有解決了我的問題。

+0

非常感謝您的支持這個! – Gaui 2014-10-01 12:27:24