2010-03-07 13 views
15

Grüße lesen, was das Problem ist, dass wenn ich versuche, Anmeldeinformationen für meine Fabrik wie folgt festzulegen:Channel Credentials + Objekt wird nur

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

ich eine Ausnahme erhalten, dass das Objekt schreibgeschützt ist. Es tritt auf, wenn ich den Benutzernamen festlegen möchte.

Antwort

23

Ja, die MSDN documentation ziemlich klar:

C# 
public ClientCredentials Credentials { get; } 

Die Eigenschaft nur eine get Accessor hat - kein set-Accessor -> es ist nur lesbar.

Auch in der Dokumentation MSDN:

Bemerkungen
Die ClientCredentials Objekt ist als eine Art von Endpunktverhalten gespeichert und können durch die Behaviours Eigenschaft zugegriffen werden.

Die OnOpened Methode initialisiert ein read-only der ClientCredentials kopieren Objekt für die Fabrik.

Also was machst du hier?

UPDATE: Sie können die Benutzeranmeldeinformationen nicht festlegen, die Ihr Client-Proxy in der Kanalfactory verwenden soll. Sehen Sie diese excellent blog post auf, wie es geht sowieso - mit ein bisschen einen Umweg:

  • zunächst den Standardendpunkt Verhalten aus der Fabrik
  • zweitens instanziiert Ihre eigenen Anmeldeinformationen
  • drittens setzen diejenigen neue Beglaubigungsschreiben als neuer Endpunkt Verhalten auf Fabrik

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

scheint ein wenig seltsam und kompliziert, aber das scheint die o zu sein ne und einzige Möglichkeit dies zu erreichen!

+0

ok..so wo soll ich es hinstellen? –

+0

aber sieh dir meinen Code an ... zuerst erstelle ich eine ChannelFactory..dann setze ich meine Zugangsdaten ein. –

+0

aber ich kann nicht, da mein _Channel vom Typ IWCFSeekFactory –

15

diese Antwort zu vervollständigen, in dem der eigentliche Weg, um es für alle gearbeitet wie bei

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

Sie entfernen müssen nicht erklärt, aber überschreiben Anmeldeinformationen gefunden:

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

Dies hat löste mein Problem.

+0

Vielen Dank für Dies! – Gaui