【问题标题】:SignalR .NET client works in console app but not in a windows serviceSignalR .NET 客户端适用于控制台应用程序,但不适用于 Windows 服务
【发布时间】: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


【解决方案1】:

我遇到了类似的问题。问题是在 URL 中使用 localhost。将localhost 替换为实际的服务器名称。

问题已解释here

该 URL 用于打开 HttpListener。使用上面的 URL( localhost 一)这个 HttpListener 将接受来自 仅限http://localhost。其他等效的 URL 不起作用:

http://127.0.0.1
http://110.120.130.140
http://myserver

【讨论】:

  • 看看我的 OP。我已经更新了它。似乎更改我服务器中的代码有效.. 但我不知道为什么
  • 这不是我在回答中所说的吗?你摆脱了 localhost 这个词。
猜你喜欢
  • 1970-01-01
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多