Freigeben über


ASP.NET SignalR Hubs API Guide – .NET Client (C#)

Warnung

Diese Dokumentation gilt nicht für die neueste Version von SignalR. 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 (Remoteprozeduraufrufe, RPCs) von einem Server an verbundene Clients und von Clients an den 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 kümmert sich um 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.

In diesem Thema verwendete Softwareversionen

Frühere Versionen dieses Themas

Informationen zu früheren Versionen von SignalR finden Sie unter Ältere Versionen von SignalR.

Fragen und Kommentare

Bitte hinterlassen Sie Feedback dazu, wie Ihnen dieses Tutorial gefallen hat und was wir in den Kommentaren unten auf der Seite verbessern könnten. Wenn Sie Fragen haben, die nicht direkt mit dem Tutorial zusammenhängen, können Sie diese im ASP.NET SignalR-Forum oder StackOverflow.com posten.

Übersicht

Dieses Dokument enthält folgende Abschnitte:

Ein Beispiel für .NET-Clientprojekte finden Sie in den folgenden Ressourcen:

Eine Dokumentation zum Programmieren des Servers oder von 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 Paket Microsoft.AspNet.SignalR ). Dieses Paket unterstützt WinRT, Silverlight, WPF, Konsolenanwendung und Windows Phone Clients für .NET 4 und .NET 4.5.

Wenn sich die Version von SignalR, die Sie auf dem Client haben, von der Version auf dem Server unterscheidet, kann Sich SignalR häufig an den Unterschied anpassen. Ein Server, auf dem SignalR Version 2 ausgeführt wird, unterstützt beispielsweise Clients, auf denen 1.1.x installiert ist, sowie Clients, auf denen Version 2 installiert ist. Wenn der Unterschied zwischen der Version auf dem Server und der Version auf dem Client zu groß ist oder wenn der Client neuer als der Server 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 erstellen und einen Proxy erstellen. Um die Verbindung herzustellen, rufen Sie die Start -Methode für das HubConnection -Objekt auf.

using (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 zum Herstellen der Verbindung aufrufen. 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. Beim Registrieren eines Handlers geben Sie an, welche Hubs Ihr Client verwenden möchte. Für einen .NET-Client erstellen Sie Hubproxys jedoch manuell, 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 Guide – Server – The /signalr URL.

Die Start -Methode wird asynchron ausgeführt. Um sicherzustellen, dass nachfolgende Codezeilen erst nach dem Herstellen der Verbindung ausgeführt werden, 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();

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

In WPF-Clients müssen Sie möglicherweise die maximale Anzahl gleichzeitiger Verbindungen von dem Standardwert 2 erhöhen. Der empfohlene Wert ist 10.

using (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);

Das folgende Beispiel zeigt, 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. Das folgende Beispiel zeigt, wie die Transportmethode im Clientcode angegeben wird.

using (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.

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 für das Verbindungsobjekt aufrufen CreateHubProxy . Die Zeichenfolge, an CreateHubProxy die Sie übergeben, ist der Name Ihrer Hub-Klasse oder der name, der HubName vom -Attribut angegeben wird, wenn eine auf dem Server verwendet wurde. Für die Namenszuordnung wird keine Groß-/Kleinschreibung berücksichtigt.

Hub-Klasse auf dem Server

public class StockTickerHub : Hub

Erstellen eines Clientproxys für die Hubklasse

using (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.

Hub-Klasse auf dem Server

[HubName("stockTicker")]
public class StockTickerHub : Hub

Erstellen eines Clientproxys für die Hubklasse

using (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();
}

Wenn Sie mehrmals mit demselben hubNameaufrufenHubConnection.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.

Beim Methodennamenabgleich wird die Groß-/Kleinschreibung nicht beachtet. Auf dem Server wird beispielsweise Clients.All.UpdateStockPrice , updatestockpriceoder UpdateStockPrice auf dem Client ausgeführtupdateStockPrice.

Verschiedene Clientplattformen haben unterschiedliche Anforderungen an 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 weiter unten in diesem Thema in einem separaten Abschnitt.

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 die Methode, die vom Server ohne Parameter aufgerufen wird (siehe WPF- und Silverlight-Beispiele weiter unten in diesem Thema)

using (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 zum Angeben der Parametertypen

Wenn die von Ihnen behandelte Methode Über Parameter verfügt, geben Sie die Typen der Parameter als generische Typen der On Methode an. Es gibt generische Überladungen der On -Methode, mit denen 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, wobei ein dynamisches Objekt für den Parameter verwendet wird (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 seine 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 vom Client

Um eine Methode auf dem Server aufzurufen, verwenden Sie die Invoke -Methode auf dem 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 keinen Rückgabewert aufweist

stockTickerHubProxy.Invoke("JoinGroup", "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 verwendet.

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 wird.

Behandeln von Verbindungslebensdauerereignissen

SignalR stellt die folgenden Ereignisse für die Verbindungslebensdauer bereit, die Sie verarbeiten 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 mit der Wiederherstellung der Verbindung beginnt.
  • Reconnected: Wird ausgelöst, wenn die verbindung mit dem zugrunde liegenden Transport wiederhergestellt 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 z. B. Warnmeldungen für Fehler anzeigen möchten, die nicht schwerwiegend sind, aber zeitweilige Verbindungsprobleme verursachen, z. B. Langsamkeit oder häufiges Löschen der Verbindung, behandeln Sie das ConnectionSlow Ereignis.

hubConnection.ConnectionSlow += () => Console.WriteLine("Connection problems.");

Weitere Informationen finden Sie unter Grundlegendes und Behandeln von Ereignissen zur Verbindungslebensdauer in SignalR.

Behandeln von Fehlern

Wenn Sie detaillierte Fehlermeldungen nicht explizit auf dem Server 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, aber wenn Sie detaillierte Fehlermeldungen zu Problembehandlungszwecken aktivieren möchten, verwenden Sie den folgenden Code auf dem Server.

var hubConfiguration = new HubConfiguration();
hubConfiguration.EnableDetailedErrors = true;
App.MapSignalR(hubConfiguration);

Um Fehler zu behandeln, die von SignalR ausgelöst werden, 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, schließen Sie den Code in einen try-catch-Block um.

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.

using (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();
}

Codebeispiele für WPF-, Silverlight- und Konsolenanwendungen für Clientmethoden, die vom Server aufgerufen werden können

Die weiter oben 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 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 Methode, die vom Server ohne Parameter aufgerufen wird

stockTickerHubProxyProxy.On("Notify", () => Console.WriteLine("Notified!"));

Methoden mit Parametern zum Angeben der Parametertypen

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));