2010-03-07 16 views
15

Salutations, quel est le problème que lorsque je tente de définir les informations d'identification pour mon usine comme suit:de vérification des pouvoirs ChannelFactory + objet est lu seulement

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

Je reçois une exception objet est en lecture seule. Cela se produit lorsque je veux définir un nom d'utilisateur.

Répondre

23

Oui, le MSDN documentation est assez clair:

C# 
public ClientCredentials Credentials { get; } 

La propriété ne a une get accesseur - pas accesseur set -> il est en lecture seule.

aussi dans la documentation MSDN:

Remarques
l'objet ClientCredentials est stocké comme un type de comportement de point de terminaison et peut sont accessibles par l'intermédiaire du Comportements propriété .

La méthode OnOpened Initialise une lecture seule copie des ClientCredentials objet pour l'usine .

Alors qu'est-ce que vous faites ici? MISE À JOUR: vous ne pouvez pas définir les informations d'identification de l'utilisateur que votre proxy client est censé utiliser dans la fabrique de canaux. Voir ce excellent blog post sur la façon de le faire de toute façon - avec un peu d'un détour:

  • d'abord, supprimer le comportement de point final par défaut de l'usine
  • d'autre part, instancier vos propres informations d'identification
  • troisièmement, mettre les de nouvelles lettres de créance comme un nouveau comportement de point final sur l'usine

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

semble un peu bizarre et compliqué, mais cela semble être le o ne et seul moyen d'y parvenir!

+0

ok..so où devrais-je le mettre? –

+0

mais regardez mon code .. d'abord je crée un ChannelFactory .. alors j'ai mis les informations d'identification. –

+0

mais je ne peux pas comme mon _Channel est de type IWCFSeekFactory –

15

Pour compléter cette réponse, la façon réelle dans laquelle il a travaillé pour tout le monde comme expliqué à

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

Vous avez besoin de ne pas supprimer, mais override trouvé les informations d'identification:

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

Ce a résolu mon problème.

+0

Merci beaucoup pour ce! – Gaui