我有一個SignalR服務器(一個Web應用程序)和一個客戶端(控制檯應用程序)。通知SignalR IIS重新啓動/關閉客戶端
我希望我的客戶端在我的服務器的IIS重啓/關閉或服務器重啓/關閉時得到通知。
可能嗎?
我有一個SignalR服務器(一個Web應用程序)和一個客戶端(控制檯應用程序)。通知SignalR IIS重新啓動/關閉客戶端
我希望我的客戶端在我的服務器的IIS重啓/關閉或服務器重啓/關閉時得到通知。
可能嗎?
你可以像下面這樣做
var connection = new HubConnection(hubUrl);
if (configureConnection != null)
configureConnection(connection);
var proxy = connection.CreateHubProxy("EventAggregatorProxyHub");
connection.Reconnected += reconnected;
其他事件
更新:在重新連接失敗
Closed
將被調用(當IIS已連續比重新連接超時接受更長的時間)。
這意味着您應該使用connection.Start()
在關閉事件失敗時重新連接,關閉事件將再次被調用,並且可以再次使用connection.Start()
重試。
下面是一個使用我的代碼的一個例子,它才能生存,這兩個IIS正在下降時,應用程序啓動和它的股價下跌,同時運行
public class HubProxyFactory : IHubProxyFactory
{
public IHubProxy Create(string hubUrl, Action<IHubConnection> configureConnection, Action<IHubProxy> onStarted, Action reconnected, Action<Exception> faulted, Action connected)
{
var connection = new HubConnection(hubUrl);
if (configureConnection != null)
configureConnection(connection);
var proxy = connection.CreateHubProxy("EventAggregatorProxyHub");
connection.Reconnected += reconnected;
connection.Error += faulted;
var isConnected = false;
Action start =() =>
{
Task.Factory.StartNew(() =>
{
try
{
connection.Start().Wait();
if(isConnected)
reconnected();
else
{
isConnected = true;
onStarted(proxy);
connected();
}
}
catch(Exception ex)
{
faulted(ex);
}
});
};
connection.Closed += start;
start();
return proxy;
}
}
我截至目前唯一的解決辦法(非常印度jubaad的)是每次在特定的時間間隔內嘗試重新連接到SignalR服務器。
HubConnection _connection = new HubConnection(Properties.Settings.Default.UserLoginDataSource);
IHubProxy _hub;
void TryConnectingDataSource()
{
try
{
_connection.Stop();
_connection.Dispose();
_connection = new HubConnection(Properties.Settings.Default.UserLoginDataSource);
_connection.StateChanged += connection_StateChanged;
_hub = _connection.CreateHubProxy("myHub");
_connection.Start().Wait();
if (_connection.State == ConnectionState.Connected)
{
_hub.On("myHubCallback", new Action<Dictionary<string, Entities.Permissions.UserTypes>>(GetUserLoginList));
_hub.Invoke("myHubMethod");
}
}
catch (Exception x)
{
EventLogger.LogError(x);
}
}
如果我會被Catch抓住,那將意味着Connection出現問題,最有可能的是ISS關閉。
你的意思是重新啓動整個IIS服務器或只是你的應用程序的工作進程? –
作爲計劃任務的觸發器,或[Windows服務](http://forums.iis.net/t/1180869.aspx?IIS+Windows+Service)? – lloyd
@AliHasan,我相信兩者都是一樣的,但我更關注工作流程的重啓。 – yogi