SignalR 是一個開發實時 Web 應用的 .NET 類庫,使用 SignalR 能夠很容易的構建基於 ASP.NET 的實時 Web 應用。SignalR 支持多種服務器和客戶端,能夠 Host 在 7.0 以上的 IIS 服務器,或者經過 Owin Host 在桌面應用和 Windows 服務的進程中;支持的客戶端有瀏覽器、桌面應用、Siliverlight、各類手機等。css
本文將會帶你作一個 WPF 應用 Host 的 SignalR 服務端,和一個 Xamarin.Android 的客戶端,實現服務端和客戶端的簡單的消息接收發送。android
服務端:sql
一、新建一個 WPF 應用,經過 Nuget 添加引用 SignalR.SelfHost 類庫跨域
Install-Package Microsoft.AspNet.SignalR.SelfHost
若是要支持跨域訪問,還須要引用 Microsoft.Owin.Cors 類庫瀏覽器
Install-Package Microsoft.Owin.Cors
二、作一個簡單的界面,顯示接收和發送的消息,在 MainWindow.xaml 中添加下面的代碼:服務器
<Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="10"> <Button Name="UxStart" Click="UxStart_Click" Width="80" Height="30" Content="啓動" Margin="20,0"/> <Button Name="UxStop" Click="UxStop_Click" Width="80" Height="30" Content="中止"/> </StackPanel> <RichTextBox Name="UxInfo" Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="10,0" IsReadOnly="True"/> <StackPanel Grid.Row="2" Orientation="Horizontal" Margin="10"> <TextBox Name="UxMessage" HorizontalAlignment="Stretch" Width="400" Height="30"/> <Button Name="UxSend" Click="UxSend_Click" Width="80" Height="30" HorizontalAlignment="Right" Content="發送"/> </StackPanel> </Grid>
以上代碼添加了一個啓動按鈕和一箇中止按鈕,用來啓動和中止 SignalR 服務端,接着添加一個 RichTextBox 用來顯示發送和收到的信息,而後是一個用來輸入要發送的信息的 TextBox 和一個 發送按鈕,最終界面以下:app
public partial class MainWindow : Window { private IDisposable _signalrServer; private string _serverUrl = "http://192.168.0.102:8080"; public MainWindow() { InitializeComponent(); UxStop.IsEnabled = false; } private void UxStart_Click(object sender, RoutedEventArgs e) { StartServer(); UxStart.IsEnabled = false; } private void StartServer() { try { _signalrServer = WebApp.Start(_serverUrl); LogMessage("服務已啓動:" + _serverUrl + "\r"); UxStop.IsEnabled = true; } catch (TargetInvocationException ex) { LogMessage(ex.Message); } } private void UxStop_Click(object sender, RoutedEventArgs e) { _signalrServer.Dispose(); Close(); } private void UxSend_Click(object sender, RoutedEventArgs e) { LogMessage("Server: " + UxMessage.Text + "\r"); var context = GlobalHost.ConnectionManager.GetHubContext<HubDemo>(); context.Clients.All.send("Server: ", UxMessage.Text); UxMessage.Text = ""; } public void LogMessage(string message) { if (UxInfo.CheckAccess()) { UxInfo.AppendText(message + "\r"); } else { Dispatcher.Invoke(() => { UxInfo.AppendText(message + "\r"); }); } } }
以上代碼包含啓動服務,向全部客戶端發送消息,記錄消息幾個方法,代碼很是簡單,這裏就不作過多的解釋了。spa
三、添加一個 Startup 類,代碼以下:.net
internal class Startup { public void Configuration(IAppBuilder app) { app.UseCors(CorsOptions.AllowAll); app.MapSignalR(); } }
如今這裏只有兩句代碼,第一句啓用跨域支持,第二句映射 SignalR 的地址。
四、新建一個 Hub,這裏命名爲 HubDemo,繼承 SignalR.Hub,代碼以下:
public class HubDemo : Hub { public void Send(string name, string message) { _repository.Log(name, message); Clients.All.Send(name, message); } }
這裏只有一個 Send 方法,發送用戶名和信息。
接着定義一個記錄接收和發送的消息的接口:
public interface IMessageRepository { void Log(string name, string message); }
接口中只定義了一個 Log 方法,帶有兩個 string 類型的參數,一個是發送消息的用戶名,一個是消息內容。