2010-03-07 32 views
15

Greetings, vấn đề là khi tôi cố gắng để thiết lập thông tin cho nhà máy của tôi như sau là gì:Credentials ChannelFactory + đối tượng được chỉ đọc

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

tôi nhận được một ngoại lệ mà đối tượng là chỉ đọc. Nó xảy ra khi tôi muốn đặt tên người dùng.

Trả lời

23

Vâng, MSDN documentation là khá rõ ràng:

C# 
public ClientCredentials Credentials { get; } 

Thuộc tính chỉ có accessor get - không có bộ accessor -> đó là chỉ đọc.

Cũng trong tài liệu MSDN:

Bình luận
object ClientCredentials được lưu trữ như một loại hành vi đầu cuối và có thể được truy cập thông qua Hành vi tài sản.

Phương pháp OnOpened khởi một read-only sao chép của ClientCredentials đối tượng cho nhà máy .

Vì vậy, bạn đang làm gì để làm ở đây ??

CẬP NHẬT: bạn không thể đặt thông tin xác thực người dùng mà proxy ứng dụng của bạn được cho là sử dụng trên nhà máy kênh. Xem excellent blog post này về cách để làm điều đó anyway - với một chút của một đường vòng:

  • đầu tiên, loại bỏ các hành vi đầu cuối mặc định từ nhà máy
  • thứ hai, nhanh chóng các thông tin riêng của bạn
  • thứ ba, thiết lập những thông tin mới như hành vi đầu cuối mới về nhà máy

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

có vẻ một chút kỳ lạ và phức tạp, nhưng điều đó dường như là o ne và cách duy nhất để đạt được điều này!

+0

ok .. vậy tôi nên đặt ở đâu? –

+0

nhưng nhìn vào mã của tôi .. trước tiên tôi tạo ra một ChannelFactory .. sau đó tôi đặt thông tin đăng nhập. –

+0

nhưng tôi không thể như _Channel của tôi là loại IWCFSeekFactory –

15

Để hoàn thành câu trả lời này, cách thực tế, trong đó nó làm việc cho tất cả mọi người như đã giải thích ở

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

Bạn không cần phải loại bỏ, nhưng override tìm thấy thông tin:

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

này có giải quyết vấn đề của tôi.

+0

Cảm ơn bạn rất nhiều vì đã điều này! – Gaui

Các vấn đề liên quan