SignalR

Då vi skall implementera någon form av chatt på jobbets webb, så testade jag SignalR lite idag, för att se om det är något man kan fixa själv.

Till att börja med följde jag Scott Hanselmans post Asynchronous scalable web applications with real-time persistent long-running connections with SignalR, och det fungerade direkt utan några problem.

När det sedan var det dags att försöka sig på att göra ett Windows-program som kunde kommunicera med SignalR, tog det lite tid att få ihop. Det hela berodde nog mest på min ovana med WPF (glömde köra Dispatchern).

Formuläret jag skapade har tre kontroller; textBox1, textBox2 och button1. Man fyller i det man vill skicka i textBox1 och klickar på button1, så skall texten skickas till servern för att ”pushas” ut till klienterna med hjälp av den dynamiska funktionen addMessage.

Hur som helst. Såhär ser min fungerade MainWindow.xaml.cs ut:

public partial class MainWindow : Window
{
	private readonly HubConnection _connection;
	private readonly IHubProxy _hub;

	public MainWindow()
	{
		InitializeComponent();

		// URL till webb-applikationen
		_connection = new HubConnection("http://localhost:55287/");

		// Fullständigt namn på "hubben"
		// (inte det korta namnet som används i JS-versionen...)
		_hub = _connection.CreateProxy("SignalR_Test.Models.Chat");

		// Lyssnar efter eventet "addMessage" från servern
		// och lägg till den mottagna strängen i textBox2.
		_hub.On("addMessage", data =>
		{
			if (textBox2.Dispatcher.CheckAccess())
			{
				textBox2.AppendText(data + Environment.NewLine);
			}
			else
			{
				textBox2.Dispatcher.Invoke(new Action(() =>
				{
					textBox2.AppendText(data + Environment.NewLine);
				}));
			}
		});

		_connection.Start().ContinueWith(task =>
		{
			if (task.IsFaulted)
				MessageBox.Show(task.Exception.Message);
		}).Wait();
	}

	private void Button1Click(object sender, RoutedEventArgs e)
	{
		// Anropa funktionen "Send" på servern med texten
		// i textBox1 som parameter.
		_hub.Invoke("Send", textBox1.Text).ContinueWith(task =>
		{
			if (task.IsFaulted)
				MessageBox.Show(task.Exception.Message);
		});
		textBox1.Clear();
	}
}

leave your comment