SignalR Konsolu uygulaması örneği


85

.Net hub'ına mesaj göndermek için signalR kullanan bir konsol veya winform uygulamasının küçük bir örneği var mı? .Net örneklerini denedim ve wiki'ye baktım ancak hub (.net) ile istemci (konsol uygulaması) arasındaki ilişki bana mantıklı gelmiyor (bunun bir örneğini bulamadım). Uygulama, bağlanmak için yalnızca hub'ın adresine ve adına mı ihtiyaç duyuyor?

Birisi, uygulamanın bir hub'a bağlanıp "Hello World" veya .net hub'ın aldığı bir şeyi gönderdiğini gösteren küçük bir kod parçası sağlayabilir mi?

PS. İyi çalışan standart bir hub sohbet örneğim var, ona Cs'de bir hub adı atamaya çalışırsam, çalışmayı durdurur yani [HubName ("test")], bunun nedenini biliyor musunuz ?.

Teşekkürler.

Geçerli Konsol uygulaması Kodu.

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

Hub Sunucusu. (farklı proje çalışma alanı)

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

Bunun için Bilgi Wiki'si http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-net-client


Tamam aslında bu gerçekten işe yaradı, sadece aynı sonucu aldığımı düşündüm, sadece bazı durma noktaları ve Console.ReadLine (); sonunda. Hay aksi !.
user685590

Yanıtlar:


111

Öncelikle sunucu uygulamasına SignalR.Host.Self'i ve istemci uygulamanıza SignalR.Client'i nuget ile kurmalısınız:

PM> Install-Package SignalR.Hosting.Self -Version 0.5.2

PM> Yükleme Paketi Microsoft.AspNet.SignalR.Client

Ardından aşağıdaki kodu projelerinize ekleyin;)

(projeleri yönetici olarak çalıştırın)

Sunucu konsolu uygulaması:

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

İstemci konsolu uygulaması:

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

Yukarıdaki kodu Windows uygulamasında kullanabilirsiniz ama gerçekten gerekli mi ?! Ne demek istediğinizden emin değilim, pencerelerde başka yollarla bildirimde bulunabilirsiniz.
Mehrdad Bahreyn

1
istemci, sunucu 0.5.2 ile 1.0.0-alpha2 arasında çalışır, örneğin, Install-Package Microsoft.AspNet.SignalR.Client -version 1.0.0- alpha2 nuget.org/packages/Microsoft.AspNet.SignalR.Client/1.0.0-alpha2 (kod ve SignalR sürümleri VS2010 SP1 kullanarak .net 4.0 ile çalışmalıdır) neden onu çalıştıramadığımı anlamaya çalışıyordum, sonunda istemciyi SignalR eski sürümleriyle denedim.
Nick Giles

güzel, gerçekten yardımcı
Dika Arta Karunia

5
.On<T>()Yöntemi çağırmadan önce olay dinleyicilerini ( yöntem çağrıları) eklemeniz gerektiğini unutmayın connection.Start().
nicolocodev


24

SignalR 2.2.1 için Örnek (Mayıs 2017)

Sunucu

Yükleme Paketi 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);
            }
        }
    }
}

Müşteri

(Mehrdad Bahreyn'in cevabıyla neredeyse aynı)

Kurulum Paketi 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
Benim için çalışmıyor ... WebApp.Start ()
Fᴀʀʜᴀɴ Aɴᴀᴍ

Belki de şans eseri, bu kendi kendine barındırılan signalr sunucusunda json serileştirme ayarlarını (örneğin camelCase) global olarak nasıl yaparsınız?
Xaris Fytrakis

2
@XarisFytrakis süper kolay, yanıt vericiyi günceller, buradan sözleşme çözümleyiciye ihtiyacınız vardır: stackoverflow.com/questions/30005575/signalr-use-camel-case ve DateFormatHandling = DateFormatHandling.IsoDateFormat, eğer js'den kullanıyorsanız .
ADOConnection

@ADOConnection Hızlı cevap için teşekkürler. Şimdi sorun, bir .net istemcisinden yöntemi çağırırken ortaya çıkıyor. Örneğin, Hub sınıfında olursam, şunu arayın: HubContext.Clients.All.UpdateMetric (yeni {Data = "xxx", Bir şey = "yyy"}, kullanıcı adı); Doğru serileştirme ayarlarıyla json yanıtı alıyorum (Camel Cased). Ancak bunu bir istemciden (asp.net istemcisi) şu şekilde aktarılan verilerle çağırırsam: public void UpdateMetric (nesne ölçümleri, dize kullanıcı adı) {HubContext.Clients.All.UpdateMetric (metrikler, kullanıcı adı); müşteri üzerindeki sonuç Deve Kasası değildir.
Xaris Fytrakis


3

Bu nokta net çekirdek 2.1 içindir - çok sayıda deneme yanılmadan sonra nihayet bunu kusursuz bir şekilde çalıştırdım:

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

Bu kod, tipik SignalR zavallı adamın sohbet istemcisinden alınmıştır. Benim ve diğer pek çok insanın karşılaştığı sorun, hub'a bir mesaj göndermeye çalışmadan önce bir bağlantı kurmak. Bu kritiktir, bu nedenle eşzamansız görevin tamamlanmasını beklemek önemlidir - bu, görevin tamamlanmasını bekleyerek onu eşzamanlı hale getirdiğimiz anlamına gelir.


aslında başlangıcı zincirleyebilir ve bağlantı olarak bekleyebilirsiniz
.StartAsync.Wait

1

@ Dyslexicanaboko'nun dotnet çekirdeği cevabını geliştirmek için, işte bir istemci konsolu uygulaması:

Bir yardımcı sınıf oluşturun:

using System;
using Microsoft.AspNetCore.SignalR.Client;

namespace com.stackoverflow.SignalRClientConsoleApp
{
    public class SignalRConnection
    {
        public async void Start()
        {
            var url = "http://signalr-server-url/hubname";

            var connection = new HubConnectionBuilder()
                .WithUrl(url)
                .WithAutomaticReconnect()
                .Build();

            // receive a message from the hub
            connection.On<string, string>("ReceiveMessage", (user, message) => OnReceiveMessage(user, message));

            var t = connection.StartAsync();

            t.Wait();

            // send a message to the hub
            await connection.InvokeAsync("SendMessage", "ConsoleApp", "Message from the console app");
        }

        private void OnReceiveMessage(string user, string message)
        {
            Console.WriteLine($"{user}: {message}");
        }

    }
}

Ardından konsol uygulamanızın giriş noktasında uygulayın:

using System;

namespace com.stackoverflow.SignalRClientConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            var signalRConnection = new SignalRConnection();
            signalRConnection.Start();

            Console.Read();
        }
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.