Есть ли небольшой пример приложения консоли или winform, использующего signalR для отправки сообщения в концентратор .net? Я пробовал примеры .net и смотрел вики, но для меня не имеет смысла отношения между хабом (.net) и клиентом (консольное приложение) (не смог найти примера этого). Приложению нужны только адрес и имя хаба для подключения?
Если бы кто-то мог предоставить небольшой лакомый кусочек кода, показывающий, что приложение подключается к концентратору и отправляет «Hello World» или что-то, что получает концентратор .net ?.
PS. У меня есть стандартный пример чата хаба, который работает хорошо. Если я попытаюсь присвоить ему имя хаба в 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);
}
}
Информационная вики для этого: http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-net-client
Ответы:
Прежде всего, вы должны установить SignalR.Host.Self в серверном приложении и SignalR.Client в своем клиентском приложении с помощью nuget:
Затем добавьте в свои проекты следующий код;)
(запускаем проекты от имени администратора)
Приложение консоли сервера:
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(); } } }
источник
.On<T>()
перед вызовомconnection.Start()
метода необходимо добавить прослушиватели событий ( вызовы методов) .Пример для 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); } } } }
Клиент
(почти так же, как ответ Мехрдада Бахрейни)
Установочный пакет 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(); } } }
источник
Self-Host теперь использует Owin. Оформить заказ http://www.asp.net/signalr/overview/signalr-20/getting-started-with-signalr-20/tutorial-signalr-20-self-host, чтобы настроить сервер. Он совместим с клиентским кодом выше.
источник
Это для 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. Проблема, с которой столкнулись я и, похоже, многие другие люди, - это установление соединения перед попыткой отправить сообщение в хаб. Это критически важно, поэтому важно дождаться завершения асинхронной задачи - это означает, что мы делаем ее синхронной, ожидая завершения задачи.
источник
Чтобы использовать ответ @dyslexicanaboko для ядра dotnet, вот клиентское консольное приложение:
Создайте вспомогательный класс:
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(); } } }
источник