ตัวอย่างแอป SignalR Console


85

มีตัวอย่างเล็กน้อยของคอนโซลหรือแอป winform ที่ใช้ signalR เพื่อส่งข้อความไปยัง. net hub หรือไม่? ฉันได้ลองใช้ตัวอย่าง. net และดูวิกิแล้ว แต่มันไม่สมเหตุสมผลสำหรับฉันที่ความสัมพันธ์ระหว่างฮับ (.net) และไคลเอนต์ (แอปคอนโซล) (ไม่พบตัวอย่างนี้) แอพต้องการที่อยู่และชื่อของฮับในการเชื่อมต่อหรือไม่?

หากมีใครสามารถให้รหัสเล็กน้อยที่แสดงว่าแอปเชื่อมต่อกับฮับและส่ง "Hello World" หรือสิ่งที่. net hub ได้รับ

ปล. ฉันมีตัวอย่างการแชทฮับมาตรฐานซึ่งใช้ได้ดีถ้าฉันพยายามกำหนดชื่อฮับใน Cs มันจะหยุดทำงานเช่น [HubName ("test")] คุณรู้สาเหตุของสิ่งนี้หรือไม่

ขอบคุณ.

รหัสแอปคอนโซลปัจจุบัน

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 ด้วยตนเองบนแอปพลิเคชันเซิร์ฟเวอร์และ SignalR.Client บนแอปพลิเคชันไคลเอนต์ของคุณโดย nuget:

PM> สัญญาณการติดตั้งแพ็คเกจ R.Hosting ตัวเอง - เวอร์ชัน 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 ด้วยวิธีอื่น
Mehrdad Bahrainy

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

ดีช่วยเหลือดีจริงๆ
Dika Arta Karunia

5
โปรดทราบว่าคุณต้องเพิ่มตัวฟังเหตุการณ์ ( .On<T>()การเรียกวิธีการ) ก่อนที่จะเรียกใช้connection.Start()เมธอด
nicolocodev

สมควรให้ลิงค์นี้: docs.microsoft.com/en-us/aspnet/signalr/overview/…
Mohammed Noureldin

24

ตัวอย่าง SignalR 2.2.1 (พฤษภาคม 2017)

เซิร์ฟเวอร์

ติดตั้งแพ็คเกจ 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);
            }
        }
    }
}

ลูกค้า

(เกือบจะเหมือนกับการตอบกลับของ Mehrdad Bahrainy)

ติดตั้งแพ็คเกจ 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
ไม่ได้ผลสำหรับฉัน ... โยนข้อยกเว้นการอ้างอิงว่างที่ WebApp เริ่ม ()
FᴀʀʜᴀɴAɴᴀᴍ

บางทีคุณอาจจะตั้งค่าการตั้งค่าอนุกรม json (เช่น camelCase) ทั่วโลกในเซิร์ฟเวอร์ Signalr ที่โฮสต์ด้วยตัวเองได้หรือไม่
Xaris Fytrakis

2
@XarisFytrakis ง่ายสุด ๆ Ive อัปเดต anwser คุณต้องมีตัวแก้ไขสัญญาจากที่นี่: stackoverflow.com/questions/30005575/signalr-use-camel-caseเช่นเดียวกับ DateFormatHandling = DateFormatHandling.IsoDateFormat ถ้าคุณกินจาก js
ADOConnection

@ADOConnection ขอบคุณสำหรับการตอบกลับอย่างรวดเร็ว ปัญหาตอนนี้คือเมื่อเรียกเมธอดจากไคลเอนต์. net ตัวอย่างเช่นถ้าฉันอยู่ในคลาส Hub ให้เรียกสิ่งนี้ว่า HubContext.ClientsAll.UpdateMetric (ใหม่ {Data = "xxx", Something = "yyy"}, ชื่อผู้ใช้); ฉันได้รับการตอบสนองของ json ด้วยการตั้งค่าการทำให้เป็นอนุกรมที่ถูกต้อง (Camel Cased) แต่ถ้าฉันเรียกมันด้วยข้อมูลที่ส่งผ่านจากไคลเอนต์ (ไคลเอนต์ asp.net) เช่นนี้โมฆะสาธารณะ UpdateMetric (เมตริกอ็อบเจ็กต์, ชื่อผู้ใช้สตริง) ผลลัพธ์บนไคลเอนต์ไม่ใช่ Camel Cased
Xaris Fytrakis


3

สำหรับ 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

1

ในการสร้างคำตอบของ @ dyslexicanaboko สำหรับ dotnet core นี่คือแอปพลิเคชันคอนโซลไคลเอนต์:

สร้างคลาสตัวช่วย:

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

    }
}

จากนั้นใช้งานในจุดเริ่มต้นของแอปคอนโซลของคุณ:

using System;

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

            Console.Read();
        }
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.