自托管SignalR服务不起作用(开始)

时间:2015-08-16 10:12:56

标签: c# signalr

我有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在另一个线程中。这似乎很好,因为我在其他工作的项目中做到了。工作线程不是问题,它只是空循环,与服务器无关。

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

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

当我尝试连接时,客户说&#34;连接被主动拒绝&#34;和Putty(telnet)也说&#34;无法连接&#34;。

问题出在哪里?简而言之,我有带有SignalR服务器的类库,在Console项目中引用它运行它,但服务器不会工作。

[编辑]

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

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

P.S。抱歉我的英语不好。

2 个答案:

答案 0 :(得分: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();
    }

正如您所看到的,使用语句已被删除,现在它正常工作!有趣的说明 - 你也可以使Singleton实现这个“引擎”,它也可以工作。

答案 1 :(得分:0)

我做了很多R&amp; S后得到了解决方案D.它是一个与账户和访问权限相关的简单变更。

在Service Installer中使用LocalSystem帐户而不是LocalService帐户。

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

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