Tôi chưa sử dụng NetNamedPipes trong WCF nhưng tôi đã dành nhiều thời gian hơn tôi quan tâm để tìm hiểu các giá trị thời gian chờ cho NetTcp. Tôi sử dụng các cấu hình sau đây cho NetTcpBindings của mình và có may mắn khi kết nối vẫn hoạt động.
Server:
<binding name="MyBindingName" sendTimeout="00:00:30" receiveTimeout="infinite">
<reliableSession enabled="true" inactivityTimeout="00:05:00" ordered="true" />
<security mode="None" />
</binding>
Chủ đầu tư:
<binding name="MyBindingName" closeTimeout="00:00:30" openTimeout="00:00:30" receiveTimeout="infinite" sendTimeout="00:00:30">
<reliableSession enabled="true" inactivityTimeout="00:01:00" ordered="true" />
<security mode="None" />
</binding>
Các thiết lập quan trọng mà tôi dành nhiều thời gian nhất trên là sendTimeout và receiveTimeout. Nếu receiveTimeout của bạn giống hoặc ít hơn gửi của bạn, kênh sẽ giảm sau khi hết thời gian chờ đó. Nếu nhận được cao hơn và gửi là trên một ngưỡng, kênh sẽ cháy một mức độ vận chuyển keepalive. Từ các thử nghiệm của tôi, ngưỡng sendTimeout là 30 giây. Bất cứ điều gì ít hơn đó và các keepalives không được gửi đi.
Ngoài ra, tôi có cuộc gọi theo chu kỳ dựa trên hẹn giờ mà tôi thực hiện từng phút để thử và đảm bảo kênh hoạt động tốt. Cuộc gọi chỉ đơn giản là cho một thành viên trở boolean:
[OperationContract(IsOneWay = false, IsInitiating = false, IsTerminating = false)]
bool KeepAlive();
public bool KeepAlive()
{
return true;
}
Bạn cũng có thể lấy các sự kiện kênh (nếu bạn nhận được chúng vào đúng thời điểm) và mở lại kết nối nếu có điều gì xấu xảy ra:
InstanceContext site = new InstanceContext(this);
_proxy = new MyServiceChannel(site);
if (_proxy != null)
{
if (_proxy.Login())
{
//Login was successful
//Add channel event handlers so we can determine if something goes wrong
foreach (IChannel a in site.OutgoingChannels)
{
a.Opened += Channel_Opened;
a.Faulted += Channel_Faulted;
a.Closing += Channel_Closing;
a.Closed += Channel_Closed;
}
}
}
Tôi hy vọng một số dịch này và có giá trị cho bạn với NetNamedPipes.
Edit: Các tuỳ chọn khác để chụp máy chủ khởi động lại vấn đề
Khi máy chủ khởi động lại nó sẽ khiến kênh của khách hàng hoặc là gần hoặc lỗi. Việc nắm bắt các sự kiện đó ở phía máy khách sẽ cung cấp cho bạn tùy chọn sử dụng bộ hẹn giờ kết nối lại cho đến khi dịch vụ có sẵn một lần nữa.
private void Channel_Faulted(object sender, EventArgs e)
{
IChannel channel = sender as IChannel;
if (channel != null)
{
channel.Abort();
channel.Close();
}
//Disable the keep alive timer now that the channel is faulted
_keepAliveTimer.Stop();
//The proxy channel should no longer be used
AbortProxy();
//Enable the try again timer and attempt to reconnect
_reconnectTimer.Start();
}
private void _reconnectTimer_Tick(object sender, System.EventArgs e)
{
if (_proxy == null)
{
InstanceContext site = new InstanceContext(this);
_proxy = new StateManagerClient(site);
}
if (_proxy != null)
{
if (_proxy.Login())
{
//The connection is back up
_reconnectTimer.Stop();
_keepAliveTimer.Start();
}
else
{
//The channel has likely faulted and the proxy should be destroyed
AbortProxy();
}
}
}
public void AbortProxy()
{
if (_proxy != null)
{
_proxy.Abort();
_proxy.Close();
_proxy = null;
}
}
Bạn muốn đảm bảo các lần đăng nhập của bộ hẹn giờ kết nối lại được thực hiện trên chuỗi nền không đồng bộ để chúng không treo giao diện người dùng mỗi khi họ cố đăng nhập. YMMV
IIRC, tham số thứ hai cuối cùng của CreateNamedPipe (chức năng win32 không được quản lý bên dưới NamedPipeBinding - http://msdn.microsoft.com/en-us/library/windows/desktop/aa365150%28v=vs.85%29.aspx) hoạt động như một thời gian chờ kết nối máy khách, mà là khá ngắn .Điều này có thể có cái gì đó để làm với thời gian chờ bạn nhìn thấy khi máy chủ bắt đầu; có lẽ bạn có thể sử dụng phản xạ/dotpeek/trình gỡ lỗi để xem các thông số nào được truyền từ WCF sang hàm gốc và nếu các tham số đó có thể được thay đổi bằng cấu hình –
Vì câu hỏi này mang tính học thuật, nói chung tôi sẽ tiếp tục theo cách này: xem các hàm gốc nào được gọi, với thời gian chờ nào, và sau đó theo dõi lại nơi các hàm này được gọi từ mã được quản lý, để xem nơi các tham số bắt nguồn. Long, nhưng vui vẻ và giúp bạn tìm ra cách nó thực sự hoạt động :) Tôi gỡ lỗi một vấn đề Sharepoint theo cách này ... –