ASP.NET SignalR Hubs-API-Leitfaden – .NET-Client (SignalR 1.x)
von Patrick Fletcher, Tom Dykstra
Warnung
Diese Dokumentation ist nicht für die neueste Version von SignalR vorgesehen. Sehen Sie sich ASP.NET Core SignalR an.
Dieses Dokument enthält eine Einführung in die Verwendung der Hubs-API für SignalR Version 2 in .NET-Clients wie Windows Store (WinRT), WPF, Silverlight und Konsolenanwendungen.
Mit der SignalR Hubs-API können Sie Remoteprozeduraufrufe (RPCs) von einem Server zu verbundenen Clients und von Clients zum Server ausführen. Im Servercode definieren Sie Methoden, die von Clients aufgerufen werden können, und rufen Methoden auf, die auf dem Client ausgeführt werden. Im Clientcode definieren Sie Methoden, die vom Server aufgerufen werden können, und rufen Methoden auf, die auf dem Server ausgeführt werden. SignalR übernimmt die gesamte Client-zu-Server-Sanitärinstallation für Sie.
SignalR bietet auch eine API auf niedrigerer Ebene namens Persistent Connections. Eine Einführung in SignalR, Hubs und persistente Verbindungen oder ein Tutorial zum Erstellen einer vollständigen SignalR-Anwendung finden Sie unter SignalR – Erste Schritte.
Übersicht
Dieses Dokument enthält folgende Abschnitte:
Ein Beispiel für .NET-Clientprojekte finden Sie in den folgenden Ressourcen:
- gustavo-armenta / SignalR-Samples auf GitHub.com (WinRT, Silverlight, Konsolen-App-Beispiele).
- DamianEdwards/SignalR-MoveShapeDemo/MoveShape.Desktop auf GitHub.com (WPF-Beispiel).
- SignalR/ Microsoft.AspNet.SignalR.Client.Samples auf GitHub.com (Beispiel für die Konsolen-App).
Eine Dokumentation zum Programmieren der Server- oder JavaScript-Clients finden Sie in den folgenden Ressourcen:
Links zu API-Referenzthemen beziehen sich auf die .NET 4.5-Version der API. Wenn Sie .NET 4 verwenden, lesen Sie die .NET 4-Version der API-Themen.
Clientsetup
Installieren Sie das NuGet-Paket Microsoft.AspNet.SignalR.Client (nicht das Microsoft.AspNet.SignalR-Paket ). Dieses Paket unterstützt WinRT, Silverlight, WPF, Konsolenanwendung und Windows Phone Clients sowohl für .NET 4 als auch für .NET 4.5.
Wenn sich die Version von SignalR, die Sie auf dem Client verwenden, von der Version auf dem Server unterscheidet, kann Sich SignalR häufig an den Unterschied anpassen. Wenn beispielsweise SignalR Version 2.0 veröffentlicht wird und Sie diese auf dem Server installieren, unterstützt der Server Clients, auf denen 1.1.x installiert ist, sowie Clients, auf denen 2.0 installiert ist. Wenn der Unterschied zwischen der Version auf dem Server und der Version auf dem Client zu groß ist, löst SignalR eine Ausnahme aus InvalidOperationException
, wenn der Client versucht, eine Verbindung herzustellen. Die Fehlermeldung lautet "You are using a version of the client that isn't compatible with the server. Client version X.X, server version X.X
".
Herstellen einer Verbindung
Bevor Sie eine Verbindung herstellen können, müssen Sie ein HubConnection
-Objekt und einen Proxy erstellen. Um die Verbindung herzustellen, rufen Sie die Start
-Methode für das HubConnection
-Objekt auf.
var hubConnection = new HubConnection("http://www.contoso.com/");
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
await hubConnection.Start();
Hinweis
Für JavaScript-Clients müssen Sie mindestens einen Ereignishandler registrieren, bevor Sie die Start
-Methode aufrufen, um die Verbindung herzustellen. Dies ist für .NET-Clients nicht erforderlich. Für JavaScript-Clients erstellt der generierte Proxycode automatisch Proxys für alle Hubs, die auf dem Server vorhanden sind, und wenn Sie einen Handler registrieren, geben Sie an, welche Hubs Ihr Client verwenden möchte. Für einen .NET-Client, den Sie manuell erstellen, erstellen Sie Hubproxys, sodass SignalR davon ausgeht, dass Sie jeden Hub verwenden, für den Sie einen Proxy erstellen.
Der Beispielcode verwendet die Standard-URL "/signalr", um eine Verbindung mit Ihrem SignalR-Dienst herzustellen. Informationen zum Angeben einer anderen Basis-URL finden Sie unter ASP.NET SignalR Hubs-API-Leitfaden – Server – Die /signalr-URL.
Die Start
-Methode wird asynchron ausgeführt. Um sicherzustellen, dass nachfolgende Codezeilen erst ausgeführt werden, nachdem die Verbindung hergestellt wurde, verwenden Sie await
in einer asynchronen ASP.NET 4.5-Methode oder .Wait()
in einer synchronen Methode. Verwenden .Wait()
Sie nicht in einem WinRT-Client.
await connection.Start();
connection.Start().Wait();
Die HubConnection
-Klasse ist threadsicher.
Domänenübergreifende Verbindungen von Silverlight-Clients
Informationen zum Aktivieren domänenübergreifender Verbindungen von Silverlight-Clients finden Sie unter Bereitstellen eines Diensts über Domänengrenzen hinweg.
Konfigurieren der Verbindung
Bevor Sie eine Verbindung herstellen, können Sie eine der folgenden Optionen angeben:
- Grenzwert für gleichzeitige Verbindungen.
- Abfragezeichenfolgenparameter.
- Die Transportmethode.
- HTTP-Header.
- Clientzertifikate.
Festlegen der maximalen Anzahl gleichzeitiger Verbindungen in WPF-Clients
Bei WPF-Clients müssen Sie möglicherweise die maximale Anzahl gleichzeitiger Verbindungen vom Standardwert 2 erhöhen. Der empfohlene Wert ist 10.
var hubConnection = new HubConnection("http://www.contoso.com/");
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
ServicePointManager.DefaultConnectionLimit = 10;
await hubConnection.Start();
Weitere Informationen finden Sie unter ServicePointManager.DefaultConnectionLimit.
Angeben von Abfragezeichenfolgenparametern
Wenn Sie Daten an den Server senden möchten, wenn der Client eine Verbindung herstellt, können Sie dem Verbindungsobjekt Abfragezeichenfolgenparameter hinzufügen. Das folgende Beispiel zeigt, wie ein Abfragezeichenfolgenparameter im Clientcode festgelegt wird.
var querystringData = new Dictionary<string, string>();
querystringData.Add("contosochatversion", "1.0");
var connection = new HubConnection("http://contoso.com/", querystringData);
Im folgenden Beispiel wird gezeigt, wie ein Abfragezeichenfolgenparameter im Servercode gelesen wird.
public class StockTickerHub : Hub
{
public override Task OnConnected()
{
var version = Context.QueryString["contosochatversion"];
if (version != "1.0")
{
Clients.Caller.notifyWrongVersion();
}
return base.OnConnected();
}
}
Angeben der Transportmethode
Im Rahmen des Verbindungsvorgangs verhandelt ein SignalR-Client normalerweise mit dem Server, um den besten Transport zu ermitteln, der sowohl vom Server als auch vom Client unterstützt wird. Wenn Sie bereits wissen, welchen Transport Sie verwenden möchten, können Sie diesen Aushandlungsprozess umgehen. Um die Transportmethode anzugeben, übergeben Sie ein Transportobjekt an die Start-Methode. Im folgenden Beispiel wird gezeigt, wie die Transportmethode im Clientcode angegeben wird.
var hubConnection = new HubConnection("http://www.contoso.com/");
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
await hubConnection.Start(new LongPollingTransport());
Der Microsoft.AspNet.SignalR.Client.Transports-Namespace enthält die folgenden Klassen, mit denen Sie den Transport angeben können.
- LongPollingTransport
- ServerSentEventsTransport
- WebSocketTransport (Nur verfügbar, wenn server und client .NET 4.5 verwenden.)
- AutoTransport (Wählt automatisch den besten Transport aus, der sowohl vom Client als auch vom Server unterstützt wird. Dies ist der Standardtransport. Das Übergeben an die
Start
-Methode hat die gleiche Auswirkung wie die Nichtübergabe.)
Der ForeverFrame-Transport ist in dieser Liste nicht enthalten, da er nur von Browsern verwendet wird.
Informationen zum Überprüfen der Transportmethode im Servercode finden Sie unter ASP.NET SignalR Hubs API Guide – Server – How to get information about the client from the Context property. Weitere Informationen zu Transporten und Fallbacks finden Sie unter Einführung in SignalR – Transporte und Fallbacks.
Angeben von HTTP-Headern
Verwenden Sie zum Festlegen von HTTP-Headern die Headers
-Eigenschaft für das Verbindungsobjekt. Im folgenden Beispiel wird gezeigt, wie ein HTTP-Header hinzugefügt wird.
hubConnection = new hubConnection("http://www.contoso.com/");
connection.Headers.Add("headername", "headervalue");
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
await connection.Start();
Angeben von Clientzertifikaten
Verwenden Sie zum Hinzufügen von Clientzertifikaten die AddClientCertificate
-Methode für das Verbindungsobjekt.
hubConnection = new hubConnection("http://www.contoso.com/");
hubConnection.AddClientCertificate(X509Certificate.CreateFromCertFile("MyCert.cer"));
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
await connection.Start();
Erstellen des Hubproxys
Um Methoden auf dem Client zu definieren, die ein Hub vom Server aufrufen kann, und um Methoden auf einem Hub auf dem Server aufzurufen, erstellen Sie einen Proxy für den Hub, indem Sie das Verbindungsobjekt aufrufen CreateHubProxy
. Die Zeichenfolge, an die Sie übergeben, CreateHubProxy
ist der Name Ihrer Hub-Klasse oder der vom HubName
Attribut angegebene Name, wenn eine auf dem Server verwendet wurde. Für die Namenszuordnung wird keine Groß-/Kleinschreibung berücksichtigt.
Hubklasse auf dem Server
public class StockTickerHub : Hub
Erstellen eines Clientproxys für die Hubklasse
var hubConnection = new HubConnection("http://www.contoso.com/");
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
await hubConnection.Start();
Wenn Sie Ihre Hub-Klasse mit einem HubName
Attribut versehen, verwenden Sie diesen Namen.
Hubklasse auf dem Server
[HubName("stockTicker")]
public class StockTickerHub : Hub
Erstellen eines Clientproxys für die Hubklasse
var hubConnection = new HubConnection("http://www.contoso.com/");
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("stockTicker");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock =>
Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
await hubConnection.Start();
Das Proxyobjekt ist threadsicher. Wenn Sie mehrmals mit demselben hubName
aufrufenHubConnection.CreateHubProxy
, erhalten Sie dasselbe zwischengespeicherte IHubProxy
Objekt.
Definieren von Methoden auf dem Client, die der Server aufrufen kann
Um eine Methode zu definieren, die der Server aufrufen kann, verwenden Sie die -Methode des Proxys On
, um einen Ereignishandler zu registrieren.
Bei der Methodennamenabgleichung wird die Groß-/Kleinschreibung nicht beachtet. Auf dem Server wird z. Clients.All.UpdateStockPrice
B. updateStockPrice
ausgeführt, updatestockprice
oder UpdateStockPrice
auf dem Client.
Verschiedene Clientplattformen haben unterschiedliche Anforderungen für das Schreiben von Methodencode zum Aktualisieren der Benutzeroberfläche. Die gezeigten Beispiele beziehen sich auf WinRT-Clients (Windows Store .NET). Beispiele für WPF-, Silverlight- und Konsolenanwendungen finden Sie in einem separaten Abschnitt weiter unten in diesem Thema.
Methoden ohne Parameter
Wenn die von Ihnen behandelte Methode keine Parameter aufweist, verwenden Sie die nicht generische Überladung der On
Methode:
Servercode, der die Clientmethode ohne Parameter aufruft
public class StockTickerHub : Hub
{
public void NotifyAllClients()
{
Clients.All.Notify();
}
}
WinRT-Clientcode für eine Methode, die vom Server ohne Parameter aufgerufen wird (siehe WPF- und Silverlight-Beispiele weiter unten in diesem Thema)
var hubConnection = new HubConnection("http://www.contoso.com/");
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHub.On("notify", () =>
// Context is a reference to SynchronizationContext.Current
Context.Post(delegate
{
textBox.Text += "Notified!\n";
}, null)
);
await hubConnection.Start();
Methoden mit Parametern, die die Parametertypen angeben
Wenn die von Ihnen behandelte Methode Parameter aufweist, geben Sie die Typen der Parameter als generische Typen der On
Methode an. Es gibt generische Überladungen der Methode, mit denen On
Sie bis zu 8 Parameter angeben können (4 für Windows Phone 7). Im folgenden Beispiel wird ein Parameter an die UpdateStockPrice
-Methode gesendet.
Servercode, der die Clientmethode mit einem Parameter aufruft
public void BroadcastStockPrice(Stock stock)
{
context.Clients.Others.UpdateStockPrice(stock);
}
Die stock-Klasse, die für den Parameter verwendet wird
public class Stock
{
public string Symbol { get; set; }
public decimal Price { get; set; }
}
WinRT-Clientcode für eine Methode, die vom Server mit einem Parameter aufgerufen wird (siehe WPF- und Silverlight-Beispiele weiter unten in diesem Thema)
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock =>
// Context is a reference to SynchronizationContext.Current
Context.Post(delegate
{
textBox.Text += string.Format("Stock update for {0} new price {1}\n", stock.Symbol, stock.Price);
}, null)
);
Methoden mit Parametern, die dynamische Objekte für die Parameter angeben
Alternativ zum Angeben von Parametern als generische Typen der On
Methode können Sie Parameter als dynamische Objekte angeben:
Servercode, der die Clientmethode mit einem Parameter aufruft
public void BroadcastStockPrice(Stock stock)
{
context.Clients.Others.UpdateStockPrice(stock);
}
Die stock-Klasse, die für den Parameter verwendet wird
public class Stock
{
public string Symbol { get; set; }
public decimal Price { get; set; }
}
WinRT-Clientcode für eine Methode, die vom Server mit einem Parameter aufgerufen wird und ein dynamisches Objekt für den Parameter verwendet (siehe WPF- und Silverlight-Beispiele weiter unten in diesem Thema)
stockTickerHubProxy.On("UpdateStockPrice", stock =>
// Context is a reference to SynchronizationContext.Current
Context.Post(delegate
{
textBox.Text += string.Format("Stock update for {0} new price {1}\n", stock.Symbol, stock.Price);
}, null)
);
Entfernen eines Handlers
Um einen Handler zu entfernen, rufen Sie dessen Dispose
Methode auf.
Clientcode für eine Methode, die vom Server aufgerufen wird
var updateStockPriceHandler = stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock =>
Context.Post(delegate
{
textBox.Text += string.Format("Stock update for {0} new price {1}\n", stock.Symbol, stock.Price);
}, null)
);
Clientcode zum Entfernen des Handlers
updateStockPriceHandler.Dispose();
Aufrufen von Servermethoden über den Client
Um eine Methode auf dem Server aufzurufen, verwenden Sie die Invoke
-Methode für den Hubproxy.
Wenn die Servermethode keinen Rückgabewert aufweist, verwenden Sie die nicht generische Überladung der Invoke
-Methode.
Servercode für eine Methode ohne Rückgabewert
public class StockTickerHub : Hub
{
public void JoinGroup(string groupName)
{
Groups.Add(Context.ConnectionId, groupName);
}
}
Clientcode, der eine Methode aufruft, die über keinen Rückgabewert verfügt
stockTickerHubProxy.Invoke("JoinGroup", hubConnection.ConnectionID, "SignalRChatRoom");
Wenn die Servermethode über einen Rückgabewert verfügt, geben Sie den Rückgabetyp als generischen Typ der Invoke
Methode an.
Servercode für eine Methode, die über einen Rückgabewert verfügt und einen komplexen Typparameter akzeptiert
public IEnumerable<Stock> AddStock(Stock stock)
{
_stockTicker.AddStock(stock);
return _stockTicker.GetAllStocks();
}
Die Stock-Klasse, die für den Parameter und den Rückgabewert verwendet wird
public class Stock
{
public string Symbol { get; set; }
public decimal Price { get; set; }
}
Clientcode, der eine Methode aufruft, die über einen Rückgabewert verfügt und einen komplexen Typparameter in einer asynchronen ASP.NET 4.5-Methode akzeptiert
var stocks = await stockTickerHub.Invoke<IEnumerable<Stock>>("AddStock", new Stock() { Symbol = "MSFT" });
foreach (Stock stock in stocks)
{
textBox.Text += string.Format("Symbol: {0} price: {1}\n", stock.Symbol, stock.Price);
}
Clientcode, der eine Methode aufruft, die über einen Rückgabewert verfügt und einen komplexen Typparameter in einer synchronen Methode akzeptiert
var stocks = stockTickerHub.Invoke<IEnumerable<Stock>>("AddStock", new Stock() { Symbol = "MSFT" }).Result;
foreach (Stock stock in stocks)
{
textBox.Text += string.Format("Symbol: {0} price: {1}\n", stock.Symbol, stock.Price);
}
Die Invoke
-Methode wird asynchron ausgeführt und gibt ein Task
-Objekt zurück. Wenn Sie oder .Wait()
nicht angebenawait
, wird die nächste Codezeile ausgeführt, bevor die von Ihnen aufgerufene Methode ausgeführt wurde.
Behandeln von Verbindungslebensdauerereignissen
SignalR stellt die folgenden Ereignisse für die Lebensdauer der Verbindung bereit, die Sie behandeln können:
Received
: Wird ausgelöst, wenn Daten über die Verbindung empfangen werden. Stellt die empfangenen Daten bereit.ConnectionSlow
: Wird ausgelöst, wenn der Client eine langsame oder häufig abgebrochene Verbindung erkennt.Reconnecting
: Wird ausgelöst, wenn der zugrunde liegende Transport beginnt, die Verbindung wiederherzustellen.Reconnected
: Wird ausgelöst, wenn der zugrunde liegende Transport wieder verbunden wurde.StateChanged
: Wird ausgelöst, wenn sich der Verbindungszustand ändert. Stellt den alten Und den neuen Zustand bereit. Informationen zu Verbindungsstatuswerten finden Sie unter ConnectionState-Enumeration.Closed
: Wird ausgelöst, wenn die Verbindung getrennt wurde.
Wenn Sie beispielsweise Warnmeldungen für Fehler anzeigen möchten, die nicht schwerwiegend sind, aber zeitweilige Verbindungsprobleme verursachen, z. B. Langsamkeit oder häufiges Abbrechen der Verbindung, behandeln Sie das ConnectionSlow
Ereignis.
hubConnection.ConnectionSlow += () => Console.WriteLine("Connection problems.");
Weitere Informationen finden Sie unter Grundlegendes und Behandeln von Verbindungslebensdauerereignissen in SignalR.
Behandeln von Fehlern
Wenn Sie detaillierte Fehlermeldungen auf dem Server nicht explizit aktivieren, enthält das Ausnahmeobjekt, das SignalR nach einem Fehler zurückgibt, minimale Informationen zum Fehler. Wenn beispielsweise ein Aufruf von newContosoChatMessage
fehlschlägt, enthält die Fehlermeldung im Fehlerobjekt "There was an error invoking Hub method 'contosoChatHub.newContosoChatMessage'.
"Das Senden detaillierter Fehlermeldungen an Clients in der Produktion wird aus Sicherheitsgründen nicht empfohlen. Wenn Sie jedoch ausführliche Fehlermeldungen zu Problembehandlungszwecken aktivieren möchten, verwenden Sie den folgenden Code auf dem Server.
var hubConfiguration = new HubConfiguration();
hubConfiguration.EnableDetailedErrors = true;
RouteTable.Routes.MapHubs(hubConfiguration);
Um Fehler zu behandeln, die SignalR auslöst, können Sie einen Handler für das Error
Ereignis für das Verbindungsobjekt hinzufügen.
hubConnection.Error += ex => Console.WriteLine("SignalR error: {0}", ex.Message);
Um Fehler von Methodenaufrufen zu behandeln, umschließen Sie den Code in einen Try-Catch-Block.
try
{
IEnumerable<Stock> stocks = await stockTickerHub.Invoke<IEnumerable<Stock>>("GetAllStocks");
foreach (Stock stock in stocks)
{
Console.WriteLine("Symbol: {0} price: {1}", stock.Symbol, stock.Price);
}
}
catch (Exception ex)
{
Console.WriteLine("Error invoking GetAllStocks: {0}", ex.Message);
}
Aktivieren der clientseitigen Protokollierung
Um die clientseitige Protokollierung zu aktivieren, legen Sie die TraceLevel
Eigenschaften und TraceWriter
für das Verbindungsobjekt fest.
var hubConnection = new HubConnection("http://www.contoso.com/");
hubConnection.TraceLevel = TraceLevels.All;
hubConnection.TraceWriter = Console.Out;
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
await hubConnection.Start();
WPF-, Silverlight- und Konsolenanwendungscodebeispiele für Clientmethoden, die der Server aufrufen kann
Die zuvor gezeigten Codebeispiele zum Definieren von Clientmethoden, die der Server aufrufen kann, gelten für WinRT-Clients. Die folgenden Beispiele zeigen den entsprechenden Code für WPF-, Silverlight- und Konsolenanwendungsclients.
Methoden ohne Parameter
WPF-Clientcode für die Methode, die vom Server ohne Parameter aufgerufen wird
stockTickerHub.On<Stock>("notify", () =>
Dispatcher.InvokeAsync(() =>
{
SignalRTextBlock.Text += string.Format("Notified!");
})
);
Silverlight-Clientcode für Methode, die vom Server ohne Parameter aufgerufen wird
stockTickerHub.On<Stock>("notify", () =>
// Context is a reference to SynchronizationContext.Current
Context.Post(delegate
{
textBox.Text += "Notified!";
}, null)
);
Clientcode der Konsolenanwendung für die Methode, die vom Server ohne Parameter aufgerufen wird
stockTickerHubProxyProxy.On("Notify", () => Console.WriteLine("Notified!"));
Methoden mit Parametern, die die Parametertypen angeben
WPF-Clientcode für eine Methode, die vom Server mit einem Parameter aufgerufen wird
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock =>
Dispatcher.InvokeAsync(() =>
{
textBox.Text += string.Format("Stock update for {0} new price {1}\n", stock.Symbol, stock.Price);
})
);
Silverlight-Clientcode für eine Methode, die vom Server mit einem Parameter aufgerufen wird
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock =>
// Context is a reference to SynchronizationContext.Current
Context.Post(delegate
{
textBox.Text += string.Format("Stock update for {0} new price {1}\n", stock.Symbol, stock.Price);
}, null)
);
Clientcode der Konsolenanwendung für eine Methode, die vom Server mit einem Parameter aufgerufen wird
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock =>
Console.WriteLine("Symbol {0} Price {1}", stock.Symbol, stock.Price));
Methoden mit Parametern, die dynamische Objekte für die Parameter angeben
WPF-Clientcode für eine Methode, die vom Server mit einem Parameter aufgerufen wird, wobei ein dynamisches Objekt für den Parameter verwendet wird
stockTickerHubProxy.On("UpdateStockPrice", stock =>
Dispatcher.InvokeAsync(() =>
{
textBox.Text += string.Format("Stock update for {0} new price {1}\n", stock.Symbol, stock.Price);
})
);
Silverlight-Clientcode für eine Methode, die vom Server mit einem Parameter aufgerufen wird, wobei ein dynamisches Objekt für den Parameter verwendet wird
stockTickerHubProxy.On("UpdateStockPrice", stock =>
// Context is a reference to SynchronizationContext.Current
Context.Post(delegate
{
textBox.Text += string.Format("Stock update for {0} new price {1}\n", stock.Symbol, stock.Price);
}, null)
);
Clientcode der Konsolenanwendung für eine Methode, die vom Server mit einem Parameter aufgerufen wird, wobei ein dynamisches Objekt für den Parameter verwendet wird
stockTickerHubProxy.On("UpdateStockPrice", stock =>
Console.WriteLine("Symbol {0} Price {1}", stock.Symbol, stock.Price));