自托管SignalR服务不工作(启动)

本文关键字:工作 启动 服务 SignalR | 更新日期: 2023-09-27 18:08:04

我有SignalR服务器作为类库项目,我在控制台应用程序中引用了它(模拟Windows服务)

下面是SignalR 的代码
    public void Start()
    {
        try
        {
            string url = @"http://*:8081";
            using (WebApp.Start<Startup>(url))
            {
                Logger.Info(string.Format("Server running at {0}", url));
            }
        }
        catch (Exception ex)
        {
            Logger.Exception(ex, "Signalr start");
        }
        Run = true;
        Logger.Info("Starting Worker");
        workerThread = new Thread(() =>
        {
            Worker();
        });
        workerThread.Start();
    }

这里是Startup类

    public class Startup
    {
        Microsoft.AspNet.SignalR.HubConfiguration hubconfiguration = null;
        public void Configuration(IAppBuilder app)
        {
            app.UseCors(CorsOptions.AllowAll);
            hubconfiguration = new HubConfiguration();
            hubconfiguration.EnableDetailedErrors = true;
            app.MapSignalR(hubconfiguration);
        }
    }

所以,它在一个线程中,而worker在另一个线程中。这似乎很好,因为我在其他项目中做了它的工作。工作线程没有问题,它只是一个空循环,与服务器没有任何关系。

问题是服务器似乎"停止"-当我用Netstat查看时,没有人在端口8081上监听。没有例外,它只是默默地失败了。

我引用了欧文。Cors(和Owin.Host.HttpListener)在控制台项目中实际运行此服务器,但正如我所说,服务器只是停止。

当我尝试连接时,客户端显示"连接主动拒绝",Putty (telnet)也显示"无法连接"。

问题在哪里?简而言之,我有一个带有SignalR服务器的类库,它在运行它的控制台项目中被引用,但服务器就是不能工作。

[编辑]

控制台应用程序启动服务的代码

    static void Main(string[] args)
    {
        ServiceEngine Engine = new ServiceEngine();
        Engine.Start();
        Console.ReadKey();
        Engine.Stop();
    }

注:对不起,我的英语不好。

自托管SignalR服务不工作(启动)

好吧,我解决了。这里有一个问题:

    public static void Start()
    {
        try
        {
            string url = @"http://127.0.0.1:8081";
            WebApp.Start<Startup>(url);
            Logger.Info(string.Format("Server running at {0}", url));
        }
        catch (Exception ex)
        {
            Logger.Exception(ex, "signalr start");
        }
        Run = true;
        Logger.Info("Starting Worker");
        workerThread = new Thread(() =>
        {
            Worker();
        });
        workerThread.Start();
    }

正如你所看到的,using语句被删除了,现在它工作得很好!有趣的提示——你也可以用单例实现这个"引擎",它也会工作。

在做了大量的研究之后,我得到了解决方案;这是一个与帐户和访问权有关的简单更改。

在服务安装程序中使用LocalSystem Account而不是LocalService Account。

您可以在服务安装程序的设计视图中进行以下更改:
Service Process Installer属性-> Account设置为LocalSystem。

或者在你的service installer的in designer.cs文件中做如下修改:
this.serviceProcessInstaller1。