SignalR Console 앱 예


84

.net 허브에 메시지를 보내기 위해 signalR을 사용하는 콘솔 또는 winform 앱의 작은 예가 있습니까? .net 예제를 시도하고 위키를 보았지만 허브 (.net)와 클라이언트 (콘솔 앱) 사이의 관계가 이해가되지 않습니다 (이 예제를 찾을 수 없음). 앱에 연결할 허브의 주소와 이름 만 있으면 되나요?

누군가가 허브에 연결하고 "Hello World"또는 .net 허브가받는 것을 보내는 앱을 보여주는 작은 코드를 제공 할 수 있다면?.

추신. 잘 작동하는 표준 허브 채팅 예제가 있습니다. 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.");
        }
    });
 }

Hub 서버. (다른 프로젝트 작업 공간)

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

이에 대한 정보 위키는 http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-net-client 입니다 .


OK 실제로 이것은 실제로 동일한 결과를 얻는다고 생각하고 일부 중지 지점과 Console.ReadLine (); 끝에. 탁탕 치다!.
user685590

답변:


110

먼저 서버 애플리케이션에 SignalR.Host.Self를 설치하고 nuget을 통해 클라이언트 애플리케이션에 SignalR.Client를 설치해야합니다.

PM> Install-Package SignalR.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 응용 프로그램에서 사용할 수 있지만 정말 필요합니까?! 무슨 뜻인지 잘 모르겠습니다. 다른 방법으로 창에서 알릴 수 있습니다.
Mehrdad Bahrainy 2011

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 버전은 VS2010 SP1을 사용하여 .net 4.0에서 작동해야 함) 왜 작동하지 못하는지 알아 내려고 결국 SignalR 초기 버전으로 클라이언트를 시도했습니다.
Nick Giles

좋은, 정말 helpfull
디카 아르타 Karunia

4
.On<T>()메서드를 호출하기 전에 이벤트 리스너 ( 메서드 호출)를 추가해야합니다 connection.Start().
nicolocodev

이 링크를 제공 할 가치가 있습니다. docs.microsoft.com/en-us/aspnet/signalr/overview/…
Mohammed Noureldin

24

SignalR 2.2.1의 예 (2017 년 5 월)

섬기는 사람

설치 패키지 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);
            }
        }
    }
}

고객

(Mehrdad Bahrainy 응답과 거의 동일)

Install-Package 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
나를 위해 작동하지 않습니다 ... WebApp.Start ()에서 null ref 예외가 발생합니다
Fᴀʀʜᴀɴ Aɴᴀᴍ

아마도 혹시이 자체 호스팅 시그널 러 서버에서 전역 적으로 json 직렬화 설정 (예 : camelCase)을 설정하는 방법은 무엇입니까?
Xaris Fytrakis

2
: 여기에서 계약 해결이 필요, 필자는 anwser를 업데이트, 아주 쉽게 @XarisFytrakis stackoverflow.com/questions/30005575/signalr-use-camel-case 당신이 JS에서 소비하는 경우뿐만 아니라 DateFormatHandling = DateFormatHandling.IsoDateFormat한다.
ADOConnection

@ADOConnection 빠른 답장을 보내 주셔서 감사합니다. 이제 문제는 .net 클라이언트에서 메서드를 호출 할 때입니다. 예를 들어 허브 클래스에있는 경우 다음을 호출합니다. HubContext.Clients.All.UpdateMetric (new {Data = "xxx", Something = "yyy"}, username); 올바른 직렬화 설정 (Camel Cased)으로 json 응답을 얻습니다. 그러나 다음과 같이 클라이언트 (asp.net 클라이언트)에서 전달 된 데이터로 호출하면 : public void UpdateMetric (object metrics, string username) {HubContext.Clients.All.UpdateMetric (metrics, username); 클라이언트의 결과는 Camel Cased가 아닙니다.
Xaris Fytrakis


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 가난한 사람의 채팅 클라이언트에서 가져온 것입니다. 저와 다른 많은 사람들이 겪은 문제는 허브에 메시지를 보내기 전에 연결을 설정하는 것입니다. 이것은 매우 중요하므로 비동기 작업이 완료 될 때까지 기다리는 것이 중요합니다. 즉, 작업이 완료 될 때까지 대기하여 동기 작업을 수행하게됩니다.


실제로 시작을 연결하고 connection.StartAsync.Wait ()
DiTap
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.