2010-03-07 12 views
15

Saludos, ¿cuál es el problema de que cuando intento configurar las credenciales de mi fábrica de la siguiente manera:Credenciales ChannelFactory + objeto es de sólo lectura

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

consigo una excepción ese objeto es de sólo lectura. Ocurre cuando quiero establecer un nombre de usuario.

Respuesta

23

Sí, el MSDN documentation es bastante claro:

C# 
public ClientCredentials Credentials { get; } 

La propiedad única tiene un descriptor de acceso get - sin acceso set -> Es de sólo lectura.

También en la documentación de MSDN:

Remarks
objeto La ClientCredentials se almacena como un tipo de comportamiento de punto final y puede puede acceder a través de la propiedad Comportamientos.

El método OnOpened inicializa una copia de sólo lectura de los ClientCredentials objeto de la fábrica .

¿Qué vas a hacer aquí?

ACTUALIZACIÓN: no puede establecer las credenciales de usuario que su cliente proxy debe usar en la fábrica de canales. Ver este excellent blog post sobre cómo hacerlo de todos modos - con un poco de un desvío:

  • primer lugar, retire el comportamiento extremo predeterminado de fábrica
  • en segundo lugar, crear instancias de sus propias credenciales
  • en tercer lugar, establecer los nuevas credenciales como nuevo comportamiento de punto final en la fábrica

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

parece un poco extraño y complicado, pero que parece ser la junta ¡y única forma de lograr esto!

+0

bien ... ¿dónde debería ponerlo? –

+0

pero mira mi código ... primero creo un ChannelFactory..then establezco las credenciales. –

+0

pero no puedo como mi _Channel es de tipo IWCFSeekFactory –

15

Para completar esta respuesta, la forma real en que se trabajó para todo el mundo, como se explica en

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

Usted no tiene que quitar, pero anulación encontró credenciales:

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

Esto tiene resolvió mi problema

+0

Muchas gracias por ¡esta! – Gaui

Cuestiones relacionadas