2013-09-23 32 views
5

Tôi đang sử dụng đoạn mã sau để gọi các phương thức dịch vụ WCFKhông thể truy cập một ngoại lệ đối tượng xử lý trong WCF

MyServiceClient proxy = new MyServiceClient(); 
proxy.Open(); 
proxy.Func1(); 
proxy.Close(); 
// Some other code 
proxy.Open(); 
proxy.Func2(); 

proxy.Close(); 

tôi nhận được ngoại lệ khi gọi 'proxy.Open()' lần thứ hai nhưng đôi khi các công trình đang . Tôi cũng có thể sử dụng các mã sau đây được hiển thị dưới đây hoạt động tốt.

MyServiceClient proxy = new MyServiceClient(); 

proxy.Func1(); 

// Some other code 

proxy.Func2(); 

proxy.Close(); 

Tôi cũng muốn biết đó là cách tốt hơn để gọi các chức năng. Cách tiếp cận nào sẽ mang lại hiệu suất tốt hơn?

+0

Có thể bạn chỉ cần xóa nó để đơn giản hóa, nhưng bạn nên sử dụng 'cuối cùng' để đảm bảo bạn luôn đóng tài nguyên mở. –

Trả lời

7

Khi bạn đóng kết nối, bạn không thể sử dụng lại.

Bạn cần tạo MyServiceClient mới tại thời điểm đó.

MyServiceClient proxy = new MyServiceClient(); 
proxy.Open(); 
proxy.Func1(); 
proxy.Close(); 

// Some other code 

proxy = new MyServiceClient(); // Recreate the client here 
proxy.Open(); 
proxy.Func2(); 
proxy.Close(); 
0

Sử dụng proxy cùng qua nhiều cuộc gọi

MyServiceClient proxy = new MyServiceClient(); 
proxy.Open(); 
proxy.Func1(); 

// Some other code 

proxy.Func2(); 
proxy.Close(); 
0

Như những người khác đã đề cập, bạn nên lo lắng về việc phát hành xác định các nguồn lực sau khi gọi Close() phương pháp, nhưng nếu Exception xảy ra trong Func1,2() phương pháp nguồn lực bên ngoài sẽ không được phát hành.

tôi đề nghị bạn sử dụng usingIDisposable mẫu, có nghĩa là mỗi lần bạn muốn sử dụng dịch vụ gọi:

using(MyServiceClient proxy = new MyServiceClient()) 
{ 
    proxy.Func1(); 
} 

mà đảm bảo rằng tất cả các nguồn lực sẽ được phát hành ngay cả khi họ gặp khó khăn trong niềng răng. Hoặc bạn có thể thực hiện việc này theo cách thủ công với kết hợp try, finally.

3

WCF là một trong số ít trường hợp (có thể chỉ chẳng hạn) trong khuôn khổ NET nơi bạn nên KHÔNG sử dụng câu lệnh using với một lớp mà thực hiện IDisposable. Điều này MSDN Article giải thích các mô hình chính xác cho việc sử dụng tài liệu tham khảo dịch vụ. Điều này cũng áp dụng cho Channel trường hợp được tạo từ ChannelFactory.

+0

Geeze Louise. Tôi đồng ý, đây là nơi duy nhất tôi đã nhìn thấy Microsoft viết này về tránh việc sử dụng tuyên bố. 'System.ObjectDisposedException' Không thể truy cập đối tượng được xử lý. Tên đối tượng: 'System.ServiceModel.Channels.ServerSessionPreambleConnectionReader + ServerFramingDuplexSessionChannel'. tại System.ServiceModel.Channels.CommunicationObject.ThrowIfDisposedOrNotOpen() tại System.ServiceModel.Channels.OutputChannel.Send (Thông báo tin nhắn, TimeSpan timeout) tại System.ServiceModel.Channels.RequestContextBase.Reply (Message message, TimeSpan timeout) – granadaCoder

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