Ví dụ về ứng dụng SignalR Console


84

Có một ví dụ nhỏ về bảng điều khiển hoặc ứng dụng winform sử dụng signalR để gửi tin nhắn đến trung tâm .net không? Tôi đã thử các ví dụ .net và đã xem qua wiki nhưng tôi thấy mối quan hệ giữa trung tâm (.net) và ứng dụng khách (ứng dụng console) không có ý nghĩa gì (không thể tìm thấy ví dụ về điều này). Ứng dụng chỉ cần địa chỉ và tên của trung tâm để kết nối?

Nếu ai đó có thể cung cấp một đoạn mã nhỏ hiển thị ứng dụng đang kết nối với một trung tâm và gửi "Hello World" hoặc thứ gì đó mà trung tâm .net nhận được ?.

Tái bút. Tôi có một ví dụ trò chuyện trung tâm tiêu chuẩn hoạt động tốt, nếu tôi cố gắng gán tên trung tâm trong Cs cho nó, nó ngừng hoạt động tức là [HubName ("test")], bạn có biết lý do cho điều này không?

Cảm ơn.

Mã ứng dụng Bảng điều khiển hiện tại.

static void Main(string[] args)
{
    //Set connection
    var connection = new HubConnection("http://localhost:41627/");
    //Make proxy to hub based on hub name on server
    var myHub = connection.CreateProxy("chat");
    //Start connection
    connection.Start().ContinueWith(task =>
    {
        if (task.IsFaulted)
        {
            Console.WriteLine("There was an error opening the connection:{0}", task.Exception.GetBaseException());
        }
        else
        {
            Console.WriteLine("Connected");
        }
    }).Wait();

    //connection.StateChanged += connection_StateChanged;

    myHub.Invoke("Send", "HELLO World ").ContinueWith(task => {
        if(task.IsFaulted)
        {
            Console.WriteLine("There was an error calling send: {0}",task.Exception.GetBaseException());
        }
        else
        {
            Console.WriteLine("Send Complete.");
        }
    });
 }

Máy chủ trung tâm. (không gian làm việc của dự án khác nhau)

public class Chat : Hub
{
    public void Send(string message)
    {
        // Call the addMessage method on all clients
        Clients.addMessage(message);
    }
}

Wiki thông tin cho điều này là http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-net-client


OK thực sự điều này thực sự hoạt động chỉ nghĩ rằng tôi nhận được cùng một kết quả chỉ cần thêm một số điểm dừng và Console.ReadLine (); cuối cùng. Ôi chao !.
dùng685590

Câu trả lời:


111

Trước hết, bạn nên cài đặt SignalR.Host.Self trên ứng dụng máy chủ và SignalR.Client trên ứng dụng khách của bạn bằng cách:

PM> Gói cài đặt SignalR.Hosting.Self -Version 0.5.2

PM> Gói cài đặt Microsoft.AspNet.SignalR.Client

Sau đó, thêm mã sau vào các dự án của bạn;)

(chạy các dự án với tư cách quản trị viên)

Ứng dụng bảng điều khiển máy chủ:

using System;
using SignalR.Hubs;

namespace SignalR.Hosting.Self.Samples {
    class Program {
        static void Main(string[] args) {
            string url = "http://127.0.0.1:8088/";
            var server = new Server(url);

            // Map the default hub url (/signalr)
            server.MapHubs();

            // Start the server
            server.Start();

            Console.WriteLine("Server running on {0}", url);

            // Keep going until somebody hits 'x'
            while (true) {
                ConsoleKeyInfo ki = Console.ReadKey(true);
                if (ki.Key == ConsoleKey.X) {
                    break;
                }
            }
        }

        [HubName("CustomHub")]
        public class MyHub : Hub {
            public string Send(string message) {
                return message;
            }

            public void DoSomething(string param) {
                Clients.addMessage(param);
            }
        }
    }
}

Ứng dụng bảng điều khiển khách hàng:

using System;
using SignalR.Client.Hubs;

namespace SignalRConsoleApp {
    internal class Program {
        private static void Main(string[] args) {
            //Set connection
            var connection = new HubConnection("http://127.0.0.1:8088/");
            //Make proxy to hub based on hub name on server
            var myHub = connection.CreateHubProxy("CustomHub");
            //Start connection

            connection.Start().ContinueWith(task => {
                if (task.IsFaulted) {
                    Console.WriteLine("There was an error opening the connection:{0}",
                                      task.Exception.GetBaseException());
                } else {
                    Console.WriteLine("Connected");
                }

            }).Wait();

            myHub.Invoke<string>("Send", "HELLO World ").ContinueWith(task => {
                if (task.IsFaulted) {
                    Console.WriteLine("There was an error calling send: {0}",
                                      task.Exception.GetBaseException());
                } else {
                    Console.WriteLine(task.Result);
                }
            });

            myHub.On<string>("addMessage", param => {
                Console.WriteLine(param);
            });

            myHub.Invoke<string>("DoSomething", "I'm doing something!!!").Wait();


            Console.Read();
            connection.Stop();
        }
    }
}

Bạn có thể sử dụng đoạn mã trên trong ứng dụng windows nhưng nó có thực sự cần thiết không ?! Tôi không chắc bạn muốn nói gì, bạn có thể thông báo trong cửa sổ theo những cách khác.
Mehrdad Bahrainy

1
máy khách hoạt động với máy chủ 0.5.2 tối đa 1.0.0-alpha2, ví dụ: Install-Package Microsoft.AspNet.SignalR.Client -version 1.0.0-alpha2 nuget.org/packages/Microsoft.AspNet.SignalR.Client/1.0.0-alpha2 (các phiên bản mã và SignalR sẽ hoạt động với .net 4.0 sử dụng VS2010 SP1) đang cố gắng tìm ra lý do tại sao tôi không thể làm cho nó hoạt động, cuối cùng đã thử ứng dụng khách với các phiên bản đầu tiên của SignalR.
Nick Giles

tốt đẹp, thực sự hữu ích
Dika Arta Karunia

4
Lưu ý rằng bạn phải thêm trình nghe sự kiện ( .On<T>()phương thức gọi) trước khi gọi connection.Start()phương thức.
nicolocodev

Nó xứng đáng để cung cấp liên kết này: docs.microsoft.com/en-us/aspnet/signalr/overview/…
Mohammed Noureldin

24

Ví dụ cho SignalR 2.2.1 (tháng 5 năm 2017)

Người phục vụ

Gói cài đặt Microsoft.AspNet.SignalR.SelfHost -Version 2.2.1

[assembly: OwinStartup(typeof(Program.Startup))]
namespace ConsoleApplication116_SignalRServer
{
    class Program
    {
        static IDisposable SignalR;

        static void Main(string[] args)
        {
            string url = "http://127.0.0.1:8088";
            SignalR = WebApp.Start(url);

            Console.ReadKey();
        }

        public class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                app.UseCors(CorsOptions.AllowAll);

                /*  CAMEL CASE & JSON DATE FORMATTING
                 use SignalRContractResolver from
                /programming/30005575/signalr-use-camel-case

                var settings = new JsonSerializerSettings()
                {
                    DateFormatHandling = DateFormatHandling.IsoDateFormat,
                    DateTimeZoneHandling = DateTimeZoneHandling.Utc
                };

                settings.ContractResolver = new SignalRContractResolver();
                var serializer = JsonSerializer.Create(settings);
                  
               GlobalHost.DependencyResolver.Register(typeof(JsonSerializer),  () => serializer);                
            
                 */

                app.MapSignalR();
            }
        }

        [HubName("MyHub")]
        public class MyHub : Hub
        {
            public void Send(string name, string message)
            {
                Clients.All.addMessage(name, message);
            }
        }
    }
}

Khách hàng

(gần giống như câu trả lời của Mehrdad Bahrainy)

Gói cài đặt Microsoft.AspNet.SignalR.Client -Version 2.2.1

namespace ConsoleApplication116_SignalRClient
{
    class Program
    {
        private static void Main(string[] args)
        {
            var connection = new HubConnection("http://127.0.0.1:8088/");
            var myHub = connection.CreateHubProxy("MyHub");

            Console.WriteLine("Enter your name");    
            string name = Console.ReadLine();

            connection.Start().ContinueWith(task => {
                if (task.IsFaulted)
                {
                    Console.WriteLine("There was an error opening the connection:{0}", task.Exception.GetBaseException());
                }
                else
                {
                    Console.WriteLine("Connected");

                    myHub.On<string, string>("addMessage", (s1, s2) => {
                        Console.WriteLine(s1 + ": " + s2);
                    });

                    while (true)
                    {
                        Console.WriteLine("Please Enter Message");
                        string message = Console.ReadLine();

                        if (string.IsNullOrEmpty(message))
                        {
                            break;
                        }

                        myHub.Invoke<string>("Send", name, message).ContinueWith(task1 => {
                            if (task1.IsFaulted)
                            {
                                Console.WriteLine("There was an error calling send: {0}", task1.Exception.GetBaseException());
                            }
                            else
                            {
                                Console.WriteLine(task1.Result);
                            }
                        });
                    }
                }

            }).Wait();

            Console.Read();
            connection.Stop();
        }
    }
}

4
Không làm việc cho tôi ... ném một ngoại lệ vô ref tại WebApp.Start ()
Fᴀʀʜᴀɴ Aɴᴀᴍ

làm thế nào tôi có thể xem tin nhắn trong trung tâm? nó có khả thi để làm vậy không ?
Kob_24

làm thế nào để làm điều này trong lõi DotNet :(?
Kob_24

@ Kob_24 xem lớp MyHub, phương thức Gửi - bạn có thể xem tin nhắn ở đó. Đối với lõi DotNet nó hoạt động gần như cùng một cách
ADOConnection

2
@XarisFytrakis siêu dễ dàng, Ive cập nhật trình anwser, bạn cần trình giải quyết hợp đồng từ đây: stackoverflow.com/questions/30005575/signalr-use-camel-case cũng như DateFormatHandling = DateFormatHandling.IsoDateFormat, nếu bạn sử dụng nó từ js.
ADOConnection


2

Đây là cho dot net core 2.1 - sau rất nhiều lần thử và sai, cuối cùng tôi đã nhận được kết quả này hoạt động hoàn hảo:

var url = "Hub URL goes here";

var connection = new HubConnectionBuilder()
    .WithUrl($"{url}")
    .WithAutomaticReconnect() //I don't think this is totally required, but can't hurt either
    .Build();

//Start the connection
var t = connection.StartAsync();

//Wait for the connection to complete
t.Wait();

//Make your call - but in this case don't wait for a response 
//if your goal is to set it and forget it
await connection.InvokeAsync("SendMessage", "User-Server", "Message from the server");

Mã này là từ ứng dụng trò chuyện của người đàn ông nghèo SignalR điển hình của bạn. Vấn đề mà tôi và những gì có vẻ như rất nhiều người khác gặp phải là thiết lập kết nối trước khi cố gắng gửi tin nhắn đến trung tâm. Điều này rất quan trọng, vì vậy điều quan trọng là phải đợi tác vụ không đồng bộ hoàn thành - có nghĩa là chúng tôi đang làm cho nó đồng bộ bằng cách chờ tác vụ hoàn thành.


bạn thực sự có thể bắt đầu chuỗi và đợi khi kết nối
.StartAsync.Wait
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.