2008-10-13 26 views
17

Tôi có đối tượng proxy được tạo bởi Visual Studio (phía máy khách) có tên là ServerClient. Tôi đang cố gắng để thiết lập ClientCredentials.UserName.UserName/Password trước khi mở một kết nối mới sử dụng mã này:Lỗi "Đối tượng chỉ đọc" khi thiết lập ClientCredentials trong WCF

InstanceContext context = new InstanceContext(this); 

m_client = new ServerClient(context); 
m_client.ClientCredentials.UserName.UserName = "Sample"; 

Ngay sau khi mã số truy cập dòng UserName nó không thành công với một "đối tượng là chỉ đọc" lỗi . Tôi biết điều này có thể xảy ra nếu kết nối đã được mở hoặc bị lỗi, nhưng tại thời điểm này tôi đã không được gọi là context.Open() được nêu ra.

Tôi đã định cấu hình Bindings (sử dụng netTcpBinding) để sử dụng Message làm chế độ bảo mật và MessageClientCredentialType được đặt thành UserName.

Bất kỳ ý tưởng nào?

Trả lời

8

Dường như bạn chỉ có thể truy cập các thuộc tính này khá sớm trong chu trình instanciation. Nếu tôi ghi đè lên các nhà xây dựng trong lớp proxy (ServerClient), tôi có thể thiết lập các thuộc tính:

base.ClientCredentials.UserName.UserName = "Sample"; 

Tôi bắt đầu đánh giá cao những người đề nghị không sử dụng các proxy tự động tích hợp được cung cấp bởi VS.

+0

Lý do duy nhất tôi sử dụng proxy của Microsoft là bởi vì nó sẽ tự động tạo các phương pháp async .. –

0

Tôi nghĩ rằng sự cố của bạn có thể liên quan đến việc sử dụng InstanceContext. Tôi nghĩ rằng đó chỉ là cần thiết cho các kênh truyền thông song công từ phía máy chủ.

Tôi thừa nhận tôi không chắc chắn về điều này, nhưng tôi nghĩ trong trường hợp này, bạn đang yêu cầu khách hàng sử dụng ngữ cảnh hiện có để nó nghĩ rằng đã có dịch vụ đang chạy và sẽ không cho phép thay đổi.

Điều gì đang thúc đẩy việc sử dụng InstanceContext?

1

tôi có mã tương tự đó là đi qua UserName tốt:

FooServiceClient client = new FooServiceClient("BasicHttpBinding_IFooService"); 
    client.ClientCredentials.UserName.UserName = "user"; 
    client.ClientCredentials.UserName.Password = "password"; 

Hãy thử tạo proxy với ràng buộc tên trong app.config.

5

đây là colution:

using SysSvcmod = System.ServiceModel.Description; 

SysSvcmod.ClientCredentials clientCredentials = new SysSvcmod.ClientCredentials(); 
clientCredentials.UserName.UserName = "user_name"; 
clientCredentials.UserName.Password = "pass_word"; 

m_client.ChannelFactory.Endpoint.Behaviors.RemoveAt(1); 
m_client.ChannelFactory.Endpoint.Behaviors.Add(clientCredentials); 
0

Nếu sử dụng một khách hàng duplex, khi bạn khởi tạo nó các DuplexChannelFactory trong DuplexClientBase rằng khách hàng của bạn có nguồn gốc từ được khởi tạo với các thông tin hiện có để nó có thể mở kênh gọi lại, đó là lý do tại sao thông tin đăng nhập sẽ chỉ đọc.

Tôi là câu hỏi thứ hai của Mike và cũng hỏi tại sao bạn sử dụng NetTcpBinding nếu bạn không sử dụng tính bảo mật mức truyền tải cố hữu của nó? Có lẽ một ràng buộc dựa trên HTTP sẽ phù hợp hơn? Điều đó sẽ cho phép bạn sử dụng chứng chỉ dựa trên bảo mật mà tôi tin rằng có thể được sửa đổi sau khi instantiation (http://msdn.microsoft.com/en-us/library/ms576164.aspx).

0

Chụp trong bóng tối nhưng netTcpBinding có cho phép xác thực tên người dùng và mật khẩu không? Hãy thử sử dụng http binding

12

Tôi nhận thấy rằng sau khi tạo một thể hiện của lớp proxy cho dịch vụ, tôi có thể đặt Tên người dùng và Mật khẩu một lần mà không có lỗi và thực hiện cuộc gọi thành công tới dịch vụ web của tôi. Khi tôi sau đó cố gắng đặt lại tên người dùng và mật khẩu trên cá thể hiện có (không cần thiết của khóa học), tôi nhận được lỗi 'Object is Read-Only' mà bạn đã đề cập. Đặt giá trị một lần cho mỗi lần hoạt động của cá thể làm việc cho tôi.

+0

thích hợp hơn, các thông tin cần phải được thiết lập trước khi bất kỳ phương pháp dịch vụ được gọi. cố gắng đặt thông tin đăng nhập sau khi gọi phương thức cho lỗi - thông tin đăng nhập được đặt ngầm khi bạn thực hiện cuộc gọi dịch vụ và không thể thay đổi ngay bây giờ; chúng không thay đổi. – morpheus

+0

Trong trường hợp của tôi, ngay cả một cái gì đó dường như vô hại như thêm một xử lý sự kiện cho đối tượng khách hàng (và không có gì khác) gây ra tài sản để trở thành chỉ đọc. – Nuzzolilo

0

Cú pháp chính xác là:

// Xóa hành vi ClientCredentials. client.ChannelFactory.Endpoint.Behaviors.Remove <ClientCredentials>();

// Thêm phiên bản chứng chỉ ứng dụng khách tùy chỉnh vào bộ sưu tập hành vi. client.ChannelFactory.Endpoint.Behaviors.Add (new MyClientCredentials());

http://msdn.microsoft.com/en-us/library/ms730868.aspx

Nó làm việc cho tôi.

0

Tôi đã gặp phải sự cố tương tự, mã của tôi bắt đầu hoạt động khi tôi thay đổi mã của mình tức là gán giá trị cho chứng chỉ ứng dụng khách ngay lập tức sau khi khởi tạo đối tượng Khách hàng.

đây là giải pháp,

ProductClient Manager = new ProductClient();  
Manager.ClientCredentials.UserName.UserName = txtUserName.Text; 
Manager.ClientCredentials.UserName.Password = txtPassword.Text; 
Các vấn đề liên quan