如何停止SignalR服务器

问题描述 投票:5回答:1

有什么方法可以停止SignalR服务器?我将自托管的SignalR服务器作为Windows服务,但找不到停止服务器/服务的任何方法。

我尝试过this,但它不起作用-服务器一直在监听并阻止服务停止。

或者,如何完全停止服务,迫使SignalR关闭?

[编辑]:

我无法共享大多数资源(版权/安全性,但我会尽力而为:

SignalR服务器初始化

Task signalRTask = null;
IDisposable SignalR;

#region SignalR server init
// Kreiraj SignalR server
try
{
    cancelTokenSrc = new CancellationTokenSource();
    signalRTask = Task.Factory.StartNew(RunSignalR, TaskCreationOptions.LongRunning, cancelTokenSrc.Token);

    logfile.Info("Starting notifications pool thread...");
    //Console.WriteLine(DateTime.Now.ToString("dd.MM.yyyy. HH:mm:ss ") + "Starting notifications pool thread...");
    senderThread = new Thread(delegate()
    {
        sender.poolEvents();
    });

    senderThread.Start();
}
catch (Exception ex)
{
    // greška u startanju SignalR servera
    ServiceEngine.logfile.Info("Error starting SignalR on " + signalr_bind + " with error:" + ex.ToString());
    //Console.WriteLine(DateTime.Now.ToString("dd.MM.yyyy. HH:mm:ss ") + "Error starting SignalR @ {1} with error {0}", ex.ToString(), signalr_bind);
}
#endregion

#region SignalR start
// pokreće signalR server
public void RunSignalR(object task)
{
    try
    {
        logfile.Info("Starting SignalR server on " + signalRBindAddr);
        SignalR = WebApp.Start(signalRBindAddr);

        logfile.Info("SignalR server running on " + signalRBindAddr);
    }
    catch (Exception ex)
    {
        ServiceEngine.logfile.Info("Error starting SignalR: " + ex.ToString());
    }
    //Console.WriteLine(DateTime.Now.ToString("dd.MM.yyyy. HH:mm:ss ") + "SignalR server running on {0}", signalRBindAddr);
}
#endregion

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var hubConfiguration = new HubConfiguration { };
        hubConfiguration.EnableDetailedErrors = true;
        app.UseCors(CorsOptions.AllowAll);
        app.MapSignalR(hubConfiguration);
    }
}

public void Stop()
{
    try
    {
        logfile.Info("Stop called...");
        SignalR.Dispose();
        cancelTokenSrc.Cancel();
        //signalRTask.Dispose();
        logfile.Info("SignalR down, exit...");
        //Console.WriteLine(DateTime.Now.ToString("dd.MM.yyyy. HH:mm:ss ") + "SignalR down, exit...");
    }
    catch (Exception ex)
    {
        ServiceEngine.logfile.Info(ex.ToString());
    }
}

[当我调用Stop()时,SignalR继续监听(客户端可以连接,端口的状态为“ LISTEN” ...),并且我无法停止服务。

P.S。抱歉,格式不正确,英语不正确

c# service signalr self-hosting
1个回答
0
投票

显然不是一个完整的答案,但是我设法达到了一个[[pause]],而不是像Self-Hosting SignalR in a Windows Service中所解释的那样,停止了我以前的服务。 但是,我随后将它们全部重构为微服务,将必须停止的集线器放置在单独的微服务中。该解决方案允许您通过SCM或直接调用(如果您在容器上运行)来手动启动和停止服务。

从架构上来说,后一种解决方案具有一定的开销,因为您要添加一个新层,该层需要身份验证,联合身份验证和数据IO。根据上下文,您可能已经具有支持该功能的基础结构。

© www.soinside.com 2019 - 2024. All rights reserved.