2010-03-07 15 views
15

Saluti, qual è il problema che quando cerco di impostare le credenziali per la mia fabbrica come segue:Credenziali ChannelFactory + oggetto è di sola lettura

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

ottengo un'eccezione che oggetto è di sola lettura. Si verifica quando voglio impostare il nome utente.

risposta

23

Sì, il MSDN documentation è abbastanza chiaro:

C# 
public ClientCredentials Credentials { get; } 

La proprietà solo ha un get di accesso - senza accesso set -> E 'in sola lettura.

anche nella documentazione MSDN:

Commento
I ClientCredentials oggetto è memorizzato come un tipo di comportamento di endpoint e possono sono accessibili attraverso la struttura comportamenti.

Il metodo OnOpened inizializza una Copia in sola lettura delle ClientCredentials oggetto per la fabbrica .

Quindi cosa stai facendo qui ??

UPDATE: non è possibile impostare le credenziali utente che il proxy client deve utilizzare nella fabbrica del canale. Vai a questa excellent blog post su come farlo comunque - con un po 'di una deviazione:

  • primo luogo, rimuovere il comportamento predefinito endpoint dalla fabbrica
  • secondo luogo, istanziare le proprie credenziali
  • in terzo luogo, impostare quelli nuove credenziali come nuovo comportamento endpoint sulla fabbrica

    // 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 
    

sembra un po 'strano e complicato, ma che sembra essere l'o solo ed unico modo per raggiungere questo obiettivo!

+0

ok..so dove dovrei metterlo? –

+0

ma guarda il mio codice..primo creo un canaleFactory..quindi imposto le credenziali. –

+0

ma non posso perché il mio _Channel è di tipo IWCFSeekFactory –

15

Per completare questa risposta, il modo concreto in cui ha funzionato per tutti, come spiegato in

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

Non necessario rimuovere, ma di esclusione trovato credenziali:

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

Questo deve risolto il mio problema

+0

Grazie mille per Questo! – Gaui

Problemi correlati