【问题标题】:Self-Hosted SignalR service won't work (start)自托管 SignalR 服务将不起作用(开始)
【发布时间】:2015-11-09 02:52:12
【问题描述】:

我有 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();
    }

这里是启动类

    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 端口。没有例外,它只是默默地失败了。

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

当我尝试连接时,客户端说“连接主动被拒绝”,而 Putty (telnet) 也说“无法连接”。

问题出在哪里?简而言之,我有带有 SignalR 服务器的类库,该类库在运行它的控制台项目中引用,但服务器无法正常工作。

[编辑]

还有启动服务的控制台应用代码

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

附:对不起我的英语不好。

【问题讨论】:

    标签: c# signalr


    【解决方案1】:

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

        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 语句已被删除,现在它可以正常工作了!有趣的说明 - 你也可以使这个“引擎”的单例实现,它也可以工作。

    【讨论】:

    • @Matei_Radu,我会的,当网站允许时......它说在两天内。
    【解决方案2】:

    经过大量的研发,我得到了解决方案。这是一个与帐户和访问权限相关的简单更改。

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

    您可以通过在服务安装程序的设计视图中进行以下更改来执行此操作:
    服务进程安装程序的属性 -> 将帐户设置为 LocalSystem。

    或通过在服务安装程序的 Designer.cs 文件中进行以下更改:
    this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;

    【讨论】:

      猜你喜欢
      • 2013-03-10
      • 2013-07-14
      • 1970-01-01
      • 2016-01-21
      • 2015-12-15
      • 2014-02-06
      • 1970-01-01
      • 1970-01-01
      • 2015-09-25
      相关资源
      最近更新 更多