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:

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.

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

Bei der Methodennamenabgleichung wird die Groß-/Kleinschreibung nicht beachtet. Auf dem Server wird z. Clients.All.UpdateStockPrice B. updateStockPriceausgeführt, updatestockpriceoder 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));