C# 通知信号器客户端IIS重新启动/关闭

C# 通知信号器客户端IIS重新启动/关闭,c#,.net,iis,signalr,C#,.net,Iis,Signalr,我有一个信号服务器(一个Web应用程序)和一个客户端(一个控制台应用程序) 我希望在服务器的IIS重新启动/关闭或服务器重新启动/关闭时通知我的客户端 有可能吗?你可以这样做 var connection = new HubConnection(hubUrl); if (configureConnection != null) configureConnection(connection); var proxy = connection.CreateHubProxy("EventAgg

我有一个信号服务器(一个Web应用程序)和一个客户端(一个控制台应用程序)

我希望在服务器的IIS重新启动/关闭或服务器重新启动/关闭时通知我的客户端


有可能吗?

你可以这样做

var connection = new HubConnection(hubUrl);
if (configureConnection != null)
    configureConnection(connection);

var proxy = connection.CreateHubProxy("EventAggregatorProxyHub");
connection.Reconnected += reconnected;

其他活动包括

  • 重新连接-在连接关闭后尝试重新连接时激发
  • Closed-连接丢失时激发
更新:

当重新连接失败时(当IIS关闭的时间比重新连接超时所接受的时间长时),将调用
Closed

这意味着您应该使用
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;
    }
}
公共类HubProxyFactory:IHubProxyFactory
{
公共IHubProxy创建(字符串hubUrl、操作配置连接、操作启动、操作重新连接、操作出错、操作已连接)
{
var连接=新的HubConnection(hubUrl);
if(configureConnection!=null)
配置连接(连接);
var proxy=connection.CreateHubProxy(“EventAggregatorProxyHub”);
连接。重新连接+=重新连接;
连接错误+=故障;
var未连接=错误;
操作开始=()=>
{
Task.Factory.StartNew(()=>
{
尝试
{
connection.Start().Wait();
如果(未连接)
重新连接();
其他的
{
断开连接=正确;
启动(代理);
连接的();
}
}
捕获(例外情况除外)
{
故障(ex);
}
});
};
连接。关闭+=启动;
start();
返回代理;
}
}

到目前为止,我唯一的解决方案(非常像印度朱巴德)是在一定的时间间隔内每次尝试重新连接到Signal server

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);
 }
}
HubConnection\u connection=新的HubConnection(Properties.Settings.Default.userlogindasource);
IHubProxy_中心;
void TryConnectingDataSource()
{
尝试
{
_连接。停止();
_connection.Dispose();
_连接=新的HubConnection(Properties.Settings.Default.UserLoginDataSource);
_connection.StateChanged+=连接\u StateChanged;
_hub=_connection.createhubbroxy(“myHub”);
_connection.Start().Wait();
if(_connection.State==ConnectionState.Connected)
{
_On(“myHubCallback”,新操作(GetUserLoginList));
_调用(“myHubMethod”);
}
}
捕获(异常x)
{
EventLogger.LogError(x);
}
}

如果我被捕获,这意味着连接有问题,很可能是ISS已关闭。

你的意思是重新启动整个IIS服务器或只是应用程序的工作进程?作为计划任务的触发器,或@AliHasan,我相信两者都是一样的,但我更愿意了解工作进程重启。你不应该先发布你尝试过的东西吗?@enki.dev,并补充说这是答案。我相信只有当重启后iss启动时,重新连接才会起作用。我想通知它什么时候响。问题中没有提到对不起。将更新。关闭似乎是有希望的,可能会工作。谢谢,我试试看。如果有效,将接受:)不,它不起作用。当我在客户端运行时停止我的ISS时,重新连接或关闭不会发生火灾。然而,如果我的客户端启动并且IIS已经关闭,那么关闭的确实会被解雇。不过谢谢你的帮助,投了赞成票。然后你做错了什么,我只是试着运行我的应用程序,然后键入iisreset或循环应用程序池。在我的.NET客户端上,这两个已触发事件都已重新连接。我正在从右侧IIS管理器的“管理网站”面板启动/停止。这和你现在做的不同吗?