wcf - for - Credenciales de ChannelFactory+objeto solo de lectura
a binding must be configured for this channel factory (3)
Esto no sucederá si la referencia de servicio se agrega a través de -> Agregar referencia de servicio -> Avanzado -> Agregar referencia web -> Url / wsdl (archivo de disco local).
El archivo reference.cs generado es diferente y le permitirá establecer credenciales. El error se debe a que es posible que haya agregado la referencia a través de la primera pantalla (Agregar referencia de servicio)
Saludos, ¿cuál es el problema cuando intento configurar las credenciales para mi fábrica de la siguiente manera?
ChannelFactory<IWCFSeekService> factory = Factory;
if (factory != null)
{
factory.Credentials.UserName.UserName = CServiceCredentials.Instance.Username;
_Channel = factory.CreateChannel();
}
Obtengo una excepción de que el objeto es de solo lectura. Ocurre cuando quiero establecer un nombre de usuario.
Para completar esta respuesta, la forma real en que funcionó para todos como se explica en
http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/4668e261-0fd0-4ca5-91d2-497aa479f2a9/
No es necesario que elimine, pero anule las credenciales encontradas:
var credentialBehaviour = factory.Endpoint.Behaviors.Find < ClientCredentials > ();
credentialBehaviour.UserName.UserName = "test";
credentialBehaviour.UserName.Password = "test";
Esto ha solucionado mi problema.
Sí, la documentación de MSDN es bastante clara:
C#
public ClientCredentials Credentials { get; }
La propiedad solo tiene un acceso get
- no hay un set set accessor - es de solo lectura.
También en los documentos de MSDN:
Observaciones
El objeto ClientCredentials se almacena como un tipo de comportamiento de punto final y se puede acceder a él a través de la propiedad Comportamientos.El método OnOpened inicializa una copia de solo lectura del objeto ClientCredentials para la fábrica.
Entonces, ¿qué estás haciendo para hacer aquí?
ACTUALIZACIÓN: no puede configurar las credenciales de usuario que su proxy de cliente debe utilizar en la fábrica de canales. Vea esta excelente publicación en el blog sobre cómo hacerlo de todos modos, con un pequeño desvío:
- Primero, elimine el comportamiento de punto final predeterminado de la fábrica.
- En segundo lugar, instancia tus propias credenciales.
en tercer lugar, establecer esas 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 esa parece ser la única forma de lograrlo.