Приклад програми для консолі SignalR


84

Чи є невеликий приклад консолі або програми winform, яка використовує signalR для надсилання повідомлення в .net хаб ?. Я спробував приклади .net і подивився вікі, але для мене це не має сенсу взаємозв'язок між концентратором (.net) та клієнтом (консольний додаток) (не можу знайти приклад цього). Чи потрібна програмі просто адреса та назва концентратора для підключення ?.

Якщо хтось може надати невеликий шматочок коду, що показує програму, яка підключається до концентратора і відправляє "Hello World" або щось, що отримує .net хаб ?.

PS. У мене є стандартний приклад чату-концентратора, який працює добре, якщо я спробую йому призначити ім'я концентратора в Cs, він перестане працювати, тобто [HubName ("тест")], чи знаєте ви причину цього ?.

Дякую.

Поточний код програми консолі.

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.");
        }
    });
 }

Сервер-концентратор. (інша робоча область проекту)

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

Інформаційна Wiki для цього є http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-net-client


Добре насправді це насправді спрацювало, просто думав, що я отримую той самий результат, просто додав деякі точки зупинки та Console.ReadLine (); в кінці. Ой!
user685590

Відповіді:


111

Перш за все, вам слід встановити SignalR.Host.Self на серверну програму та SignalR.Client на вашу клієнтську програму за допомогою nuget:

PM> Сигнал встановлення-пакету R.Hosting.Self -Версія 0.5.2

PM> Встановити-пакет Microsoft.AspNet.SignalR.Client

Потім додайте наступний код до своїх проектів;)

(запускати проекти як адміністратор)

Додаток консолі сервера:

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);
            }
        }
    }
}

Додаток консолі клієнта:

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();
        }
    }
}

Ви можете використовувати наведений вище код у програмі Windows, але чи справді це потрібно ?! Я не впевнений, що ви маєте на увазі, ви можете повідомити про це у Windows іншими способами.
Мехрдад Бахрейн

1
клієнт працює з сервером 0.5.2 до 1.0.0-alpha2, наприклад, Install-Package Microsoft.AspNet.SignalR.Client -version 1.0.0- alpha2 nuget.org/packages/Microsoft.AspNet.SignalR.Client/1.0.0-alpha2 (версії коду та SignalR повинні працювати з .net 4.0 за допомогою VS2010 SP1), намагався з’ясувати, чому я не міг змусити його працювати, врешті-решт спробував клієнта з ранніми версіями SignalR.
Nick Giles

приємно, справді корисно
Діка Арта Карунія

4
Зверніть увагу, що .On<T>()перед викликом connection.Start()методу потрібно додати прослуховувачі подій ( виклики методу) .
nicolocodev

Заслуговує надати це посилання: docs.microsoft.com/en-us/aspnet/signalr/overview/…
Мохаммед Нурелдін,

24

Приклад для SignalR 2.2.1 (травень 2017 р.)

Сервер

Встановити-пакет Microsoft.AspNet.SignalR.SelfHost -Версія 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);
            }
        }
    }
}

Клієнт

(майже те саме, що відповідь Мехрдада Бахрейна)

Встановити-пакет Microsoft.AspNet.SignalR.Client -Версія 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
Не працює для мене ... викидає виняток null ref на WebApp.Start ()
Fᴀʀʜᴀɴ Aɴᴀᴍ

як я можу побачити повідомлення в хабі? чи можна це зробити?
Kob_24

як це зробити в dotnet core :(?
Kob_24

@ Kob_24 див. Клас MyHub, метод Send - там можна побачити повідомлення. Для дотнет-ядра це працює майже однаково
ADOConnection

2
@XarisFytrakis супер просто, Ive оновлює anwser, вам необхідно контракт распознаватель тут: stackoverflow.com/questions/30005575/signalr-use-camel-case , а також DateFormatHandling = DateFormatHandling.IsoDateFormat, якщо ви споживаєте його від JS.
ADOCПідключення


2

Це для dot net core 2.1 - після багатьох спроб і помилок я нарешті змусив це працювати бездоганно:

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");

Цей код належить до типового клієнта чату бідної жінки SignalR. Проблема, з якою стикалися я та багато інших людей, полягає у встановленні зв’язку перед спробою надіслати повідомлення до концентратора. Це критично важливо, тому важливо дочекатися завершення асинхронного завдання - це означає, що ми робимо його синхронним, чекаючи завершення завдання.


ви могли б насправді ланцюжок запуску і зачекати як з'єднання.
StartAsync.Wait
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.