问题 SignalR 2.0 .NET控制台客户端


我有我的服务器控制台应用:

    static void Main(string[] args)
    {
        string url = "http://localhost: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 MyHub : Hub
{
    public void Send(string name, string message)
    {
        var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
        context.Clients.All.addMessage(name, message);
    }
}
public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.UseCors(CorsOptions.AllowAll);
        app.MapSignalR();
    }
}

我的.NET客户端应用程序

    static void Main(string[] args)
    {

        MainAsync().Wait();
        Console.ReadLine();
    }

    static async Task MainAsync()
    {
        try
        {

            var hubConnection = new HubConnection("http://localhost:8080/");
            //hubConnection.TraceLevel = TraceLevels.All;
            //hubConnection.TraceWriter = Console.Out;
            IHubProxy hubProxy = hubConnection.CreateHubProxy("MyHub");
            hubProxy.On("addMessage", data =>
                {
                    Console.WriteLine("Incoming data: {0} {1}", data.name, data.message);
                });
            ServicePointManager.DefaultConnectionLimit = 10;
            await hubConnection.Start();

        }
        catch (Exception ex)
        {

        }
    }

运行客户端时,我没有收到任何错误。但是,控制台上没有打印出任何内容。

当我取消注释这两行时:

hubConnection.TraceLevel = TraceLevels.All;
hubConnection.TraceWriter = Console.Out;

我能够在控制台中看到一些跟踪输出

07:56:28.0121460 - 355ca933-de49-400b-b859-c9dde6361151 - WS: OnMessage({"C":"d-
69A14839-B,0|C,0|D,1|E,0","S":1,"M":[]})
07:56:28.0277722 - 355ca933-de49-400b-b859-c9dde6361151 - ChangeState(Connecting
, Connected)
07:56:33.4655493 - 355ca933-de49-400b-b859-c9dde6361151 - WS: OnMessage({"C":"d-
69A14839-B,1|C,0|D,1|E,0","M":[{"H":"MyHub","M":"addMessage","A":["Server","Hello World"]}]}
)
07:56:37.9657773 - 355ca933-de49-400b-b859-c9dde6361151 - WS: OnMessage({})
 07:56:47.9975354 - 355ca933-de49-400b-b859-c9dde6361151 - WS: OnMessage({})

“服务器”和“Hello World”是从服务器发送的消息,所以我猜客户端正在接收消息,只是因为我可能以错误的方式将它们打印到控制台

有人可以帮忙吗?

附加信息:我能够在我的MVC应用程序上收到很好的消息。


919
2018-03-03 08:00


起源

你能从控制台发送消息到另一个吗? - moji


答案:


你不应该像这样声明你的hubProxy事件处理程序吗?

hubProxy.On<string, string>("Send", (name, message) => 
{
   Console.WriteLine("Incoming data: {0} {1}", name, message);
});

12
2018-03-03 08:11



谢谢。我可以拥有多少个字符串参数? - Null Reference
您始终可以使用以下内容:hubProxy.On <MyFancyMessage>(“Send”,(message)=> Console.WriteLine(“Incoming data:{0} {1}”,message.Member1,message.Member2);}) ; - David Brabant
@DavidBrabant我想到了 "addMessage" 是正确的第一个参数?你会 .Invoke  "Send" 对? - Klors
@klors服务器MyHub上的方法名称是Send。客户端调用Send,后者又向所有客户端广播“addMessage”。如果Send和addMessage是相同的函数,那么你将获得无限递归。 - dthorpe
@dthorpe感谢您的回应 - 不幸的是,在此期间我完全忘记了我认为我对SignalR所知的一切,所以我必须接受你的意见,直到我被迫重新审视这个主题。干杯 - Klors