Câu trả lời ngắn gọn là với Lớp proxy dịch vụ web, bạn nên đóng chúng và không loại bỏ chúng.
Trong hầu hết mọi trường hợp, bạn nên vứt bỏ những thứ triển khai IDisposable. Tuy nhiên, các lớp Proxy dịch vụ Web là một trường hợp đặc biệt.Với các lớp này và tất cả các lớp được kế thừa từ System.ServiceModel.ClientBase
, cách tốt nhất là không phải là bỏ cuộc gọi mà gọi trực tiếp phương thức Đóng.
Sử dụng phản xạ, bạn có thể thấy phương thức Dispose
của ClientBase
chỉ cần gọi Close
. Vì vậy, nếu không có ngoại lệ, Dispose
và Close
cũng sẽ thực hiện tương tự. Tuy nhiên, nếu có một ngoại lệ, sẽ có những hành vi khác nhau.
Bởi vì phương pháp Close
có thể ném ngoại lệ, bạn nên gọi trực tiếp và bắt ngoại lệ. Nếu bạn gọi phương thức Dispose
, bạn cũng nên nắm bắt các ngoại lệ, nhưng mã của bạn sẽ khó hiểu hơn.
Điều này cũng có nghĩa là bạn nên tránh đặt tuyên bố của proxy trong tuyên bố using
. Trong trường hợp này, nếu một ngoại lệ được ném vào khối using
, nó sẽ bị che khuất. Cuộc gọi Dispose
được tự động tạo bởi khối using
sẽ được gọi vì nó nằm trong khối finally
. Ngoại lệ được ném từ số Close
trong số Dispose
sẽ che khuất bất kỳ ngoại lệ nào đã bị ném trước đó.
Để xem các khám phá chi tiết hơn, hãy đọc các bài viết này trên MSDN, Coding Up Style, BlogginAbout.Net và StackOverflow.
Đối với cốt truyện về lý do tại sao nó được triển khai theo cách này, hãy kiểm tra chủ đề này trên MSDN forums.
Lưu ý rằng các liên kết đó cụ thể đối với Tài liệu tham khảo dịch vụ WCF, không phải tài liệu tham khảo Web .NET 2.0. Nó tạo sự khác biệt cách bạn tạo proxy của mình. – TrueWill