自托管 SignalR 服务将无法工作(开始)
Self-Hosted SignalR service won't work (start)
我将 SignalR 服务器作为 Class 库项目,我在控制台应用程序中引用了它(以模拟 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();
}
这是启动 class
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 在另一个线程中。这似乎很好,因为我在它工作的其他项目中做了它。工作线程没有问题,它只是一个空循环,与服务器没有任何关系。
问题是服务器似乎 "stop" - 当我使用 Netstat 查看时,没有人在侦听端口 8081。没有例外,它只是默默地失败。
我在实际运行此服务器的控制台项目中引用了 Owin.Cors(和 Owin.Host.HttpListener),但正如我所说,服务器刚刚停止。
当我尝试连接时,客户端显示 "connection actively refused" 并且 Putty (telnet) 也显示 "can't connect"。
问题出在哪里?简而言之,我有 Class 带有 SignalR 服务器的库,该库在运行它的控制台项目中被引用,但服务器无法工作。
[编辑]
并且有启动服务的控制台应用代码
static void Main(string[] args)
{
ServiceEngine Engine = new ServiceEngine();
Engine.Start();
Console.ReadKey();
Engine.Stop();
}
P.S。抱歉我的英语不好。
嗯,我解决了。这是一个问题:
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 语句已被删除,现在可以正常使用了!有趣的注意事项 - 你也可以使这个 "Engine" 的 Singleton 实现,它也可以工作。
经过大量研发,我得到了解决方案。这是一个与帐户和访问权限相关的简单更改。
在服务安装程序中使用 LocalSystem 帐户而不是 LocalService 帐户。
您可以通过在服务安装程序的设计视图中进行以下更改来执行此操作:
服务进程安装程序的属性 -> 将帐户设置为 LocalSystem。
或者通过在服务安装程序的 designer.cs 文件中进行以下更改:
这个.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
我将 SignalR 服务器作为 Class 库项目,我在控制台应用程序中引用了它(以模拟 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();
}
这是启动 class
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 在另一个线程中。这似乎很好,因为我在它工作的其他项目中做了它。工作线程没有问题,它只是一个空循环,与服务器没有任何关系。
问题是服务器似乎 "stop" - 当我使用 Netstat 查看时,没有人在侦听端口 8081。没有例外,它只是默默地失败。
我在实际运行此服务器的控制台项目中引用了 Owin.Cors(和 Owin.Host.HttpListener),但正如我所说,服务器刚刚停止。
当我尝试连接时,客户端显示 "connection actively refused" 并且 Putty (telnet) 也显示 "can't connect"。
问题出在哪里?简而言之,我有 Class 带有 SignalR 服务器的库,该库在运行它的控制台项目中被引用,但服务器无法工作。
[编辑]
并且有启动服务的控制台应用代码
static void Main(string[] args)
{
ServiceEngine Engine = new ServiceEngine();
Engine.Start();
Console.ReadKey();
Engine.Stop();
}
P.S。抱歉我的英语不好。
嗯,我解决了。这是一个问题:
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 语句已被删除,现在可以正常使用了!有趣的注意事项 - 你也可以使这个 "Engine" 的 Singleton 实现,它也可以工作。
经过大量研发,我得到了解决方案。这是一个与帐户和访问权限相关的简单更改。
在服务安装程序中使用 LocalSystem 帐户而不是 LocalService 帐户。
您可以通过在服务安装程序的设计视图中进行以下更改来执行此操作:
服务进程安装程序的属性 -> 将帐户设置为 LocalSystem。
或者通过在服务安装程序的 designer.cs 文件中进行以下更改:
这个.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;