Tôi đang làm việc trên một ứng dụng winform sẽ truy cập dịch vụ WCF tự lưu trữ dưới dạng dịch vụ cửa sổ. Tôi đang sử dụng ChannelFactory thay vì tham chiếu dịch vụ. Tôi đã thành công trong việc kết nối và gọi dịch vụ WCF. Vấn đề là khi tôi để ứng dụng ở chế độ không hoạt động trong 20 phút và sau đó thử thực hiện một cuộc gọi khác. Tôi nhận được lỗi sau:Thực hành tốt nhất với WCF ChannelFactory và thời gian chờ kết nối
"Kết nối ổ cắm bị hủy. Điều này có thể do lỗi xử lý tin nhắn của bạn hoặc thời gian chờ bị vượt quá bởi máy chủ từ xa hoặc sự cố tài nguyên mạng cơ bản. 00: 00: 59.9489970 '. "
Tôi đang tìm cách thực hành tốt nhất về quản lý kết nối. Tôi hiện đã tạo một hàm gọi là PrepareWCFConnection (xem bên dưới) để kiểm tra trạng thái của kênh và ChannelFactory. Tôi gọi phương thức này trước khi tôi thực hiện bất kỳ cuộc gọi nào đến các dịch vụ WCF. Có cách nào tốt hơn để xử lý việc này không?
public bool PrepareWCFConnection()
{
if ((channelFactory == null) ||
(channelFactory.State == CommunicationState.Faulted) ||
(channelFactory.State != CommunicationState.Opened))
{
channelFactory = new ChannelFactory<IService1>(new NetTcpBinding(), endpointAddress);
}
if ((proxy == null) ||
(((IClientChannel)proxy).State == CommunicationState.Faulted) ||
(((IClientChannel)proxy).State != CommunicationState.Opened))
{
proxy = channelFactory.CreateChannel(endpointAddress);
((IClientChannel)proxy).Open();
}
return true;
}
Thử nghiệm khác của mã trên đã chứng tỏ nó không hoạt động. Cả ChannelFactory và kênh đều mở nhưng tôi vẫn nhận được lỗi này sau khi cho phép hệ thống không hoạt động: Kết nối socket đã bị hủy bỏ. Điều này có thể do lỗi xử lý tin nhắn của bạn hoặc thời gian chờ nhận được vượt quá bởi máy chủ từ xa hoặc sự cố tài nguyên mạng cơ bản. Thời gian chờ của ổ cắm cục bộ là '00: 00: 59.9479970 '. – econner
Đây là một liên kết từ MSDN cho thấy việc tạo kênh và kênh riêng, thực hiện cuộc gọi và đóng kênh rồi đóng nhà máy kênh. Tuy nhiên, nếu bạn sử dụng khoản tín dụng để xác thực, sẽ không đóng kênh sau mỗi cuộc gọi phương thức và tạo lại kênh trước khi mỗi phương thức tốn kém về tài nguyên và thời gian? http://msdn.microsoft.com/en-us/library/ms734681.aspx – econner
Sau khi thử nghiệm thêm, trước tiên tôi bắt đầu cuộc gọi đến dịch vụ WCF bằng PrepareWCFConnection() ... sau đó gọi phương thức dịch vụ của tôi và sau đó gọi ((IClientChannel) proxy) .Đóng(); Điều này sẽ đóng kết nối kênh và sau đó tạo kênh mới cho mỗi cuộc gọi phương thức. Đây có phải là phương pháp hay nhất không? – econner