【发布时间】:2014-03-04 02:40:18
【问题描述】:
这是我的 SignalR 控制台应用程序,它运行良好。它能够接收来自 Hub 的消息并将它们打印到控制台上。
static void Main(string[] args)
{
MainAsync().Wait();
Console.ReadLine();
}
static async Task MainAsync()
{
try
{
var hubConnection = new HubConnection("http://localhost:8080/");
IHubProxy hubProxy = hubConnection.CreateHubProxy("MyHub");
hubProxy.On<string, string>("addMessage", (name, message) =>
{
Console.WriteLine("Incoming data: {0} {1}", name, message);
});
ServicePointManager.DefaultConnectionLimit = 10;
await hubConnection.Start();
}
catch (Exception ex)
{
}
}
我创建了一个 Windows 服务,并且几乎一个字符一个字符地复制,除了打印到控制台的部分,我将它打印到一个日志文件中
protected override void OnStart(string[] args)
{
Log.Info("Starting...");
StartListening().Wait();
}
private static async Task StartListening()
{
try
{
var hubConnection = new HubConnection("http://localhost:8080/");
IHubProxy hubProxy = hubConnection.CreateHubProxy("MyHub");
hubProxy.On<string, string>("addMessage", (name, message) =>
{
Log.Info(string.Format("Incoming data: {0} {1}", name, message));
});
ServicePointManager.DefaultConnectionLimit = 10;
await hubConnection.Start();
Log.Info("Connected");
}
catch (Exception ex)
{
Log.Error(ex);
}
}
这是我的服务器代码:
static void Main(string[] args)
{
//string url = "http://localhost:8080";
string url = "http://*:8080";
using (WebApp.Start(url))
{
MyHub hub = new MyHub();
Console.WriteLine("Server running on {0}", url);
var key = Console.ReadLine();
while (key != "quit")
{
hub.Send("Server", key);
}
}
}
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseCors(CorsOptions.AllowAll);
app.MapSignalR();
}
}
public class MyHub : Hub
{
public void Send(string name, string message)
{
//Clients.All.addMessage(name, message);
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.All.addMessage(name, message);
}
}
但是,除了“正在启动...”和“已连接”之外,没有任何内容写入日志文件
也没有抛出异常。
我是否需要添加任何其他内容或修改 SignalR 的代码才能在 Windows 服务上工作?
更新
显然,似乎改变了这一行
string url = "http://localhost:8080";
到这里
string url = "http://*:8080";
在我的服务器代码中解决了我的问题。但我不知道为什么。
【问题讨论】:
-
发布服务器端代码。您的服务是否与您的控制台应用在同一帐户下运行?
-
我已经添加了我的服务器代码
-
这可能不是 问题,但您的
OnStart代码是错误的。OnStart在不“属于”您的线程上被调用 - 用Wait调用阻止它是错误的。在您从OnStart返回之前,服务控制管理器不会认为您的服务已启动。如果你想在线程上运行(或阻塞)一些东西,你需要自己创建一个。 -
那么我的 OnStart 代码应该如何?
-
通常您会创建自己的线程和/或计时器来执行您的服务应该执行的任何工作,然后返回。
标签: c# .net windows-services console-application signalr