ASP.NET SignalR Hubs API Kılavuzu - .NET İstemcisi (C#)

Uyarı

Bu belgeler SignalR'nin en son sürümüne yönelik değildir. SignalR ASP.NET Core göz atın.

Bu belge, Windows Mağazası (WinRT), WPF, Silverlight ve konsol uygulamaları gibi .NET istemcilerinde SignalR sürüm 2 için Hubs API'sini kullanmaya giriş sağlar.

SignalR Hubs API'sini kullanarak bir sunucudan bağlı istemcilere ve istemcilerden sunucuya uzaktan yordam çağrıları (RPC) yapabilirsiniz. Sunucu kodunda, istemciler tarafından çağrılabilecek yöntemleri tanımlarsınız ve istemcide çalışan yöntemleri çağırırsınız. İstemci kodunda, sunucudan çağrılabilecek yöntemleri tanımlarsınız ve sunucuda çalışan yöntemleri çağırırsınız. SignalR, istemciden sunucuya tüm tesisatı sizin için halleder.

SignalR ayrıca Kalıcı Bağlantılar adlı alt düzey bir API sunar. SignalR, Hubs ve Kalıcı Bağlantılar'a giriş yapmak veya eksiksiz bir SignalR uygulaması oluşturmayı gösteren bir öğretici için bkz. SignalR - Başlarken.

Bu konuda kullanılan yazılım sürümleri

Bu konunun önceki sürümleri

SignalR'nin önceki sürümleri hakkında bilgi için bkz. SignalR Eski Sürümleri.

Sorular ve yorumlar

Lütfen bu öğreticiyi nasıl beğendiğiniz ve sayfanın altındaki yorumlarda neleri geliştirebileceğimiz hakkında geri bildirim bırakın. Öğreticiyle doğrudan ilgili olmayan sorularınız varsa bunları ASP.NET SignalR forumunu veya StackOverflow.com gönderebilirsiniz.

Genel Bakış

Bu belgede aşağıdaki bölümler yer alır:

Örnek bir .NET istemci projeleri için aşağıdaki kaynaklara bakın:

Sunucuyu veya JavaScript istemcilerini programlama hakkında belgeler için aşağıdaki kaynaklara bakın:

API Başvurusu konularının bağlantıları API'nin .NET 4.5 sürümünedir. .NET 4 kullanıyorsanız API konularının .NET 4 sürümüne bakın.

İstemci kurulumu

Microsoft.AspNet.SignalR.Client NuGet paketini (Microsoft.AspNet.SignalR paketini değil) yükleyin. Bu paket hem .NET 4 hem de .NET 4.5 için WinRT, Silverlight, WPF, konsol uygulaması ve Windows Phone istemcilerini destekler.

İstemcide bulunan SignalR sürümü sunucudaki sürümden farklıysa SignalR genellikle farka uyum sağlar. Örneğin, SignalR sürüm 2 çalıştıran bir sunucu, 1.1.x yüklü istemcilerin yanı sıra sürüm 2'nin yüklü olduğu istemcileri de destekler. Sunucudaki sürümle istemcideki sürüm arasındaki fark çok büyükse veya istemci sunucudan daha yeniyse, istemci bağlantı kurmaya çalıştığında SignalR bir InvalidOperationException özel durum oluşturur. Hata iletisi : "You are using a version of the client that isn't compatible with the server. Client version X.X, server version X.X".

Bağlantı kurma

Bağlantı kurabilmeniz için önce bir nesne oluşturmanız ve bir HubConnection ara sunucu oluşturmanız gerekir. Bağlantıyı kurmak için nesnesi üzerinde yöntemini çağırın StartHubConnection .

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

Not

JavaScript istemcileri için, bağlantıyı kurmak için yöntemini çağırmadan Start önce en az bir olay işleyicisi kaydetmeniz gerekir. Bu, .NET istemcileri için gerekli değildir. JavaScript istemcileri için, oluşturulan ara sunucu kodu sunucuda bulunan tüm Hub'lar için otomatik olarak proxy'ler oluşturur ve bir işleyici kaydetmek, istemcinizin hangi Hub'ları kullanmayı amaçladığını gösterir. Ancak bir .NET istemcisi için Hub proxy'lerini el ile oluşturursunuz; bu nedenle SignalR, ara sunucu oluşturduğunuz herhangi bir Hub'ı kullanacağınızı varsayar.

Örnek kod, SignalR hizmetinize bağlanmak için varsayılan "/signalr" URL'sini kullanır. Farklı bir temel URL belirtme hakkında bilgi için bkz. ASP.NET SignalR Hubs API Kılavuzu - Sunucu - /signalr URL'si.

Start yöntemi zaman uyumsuz olarak yürütülür. Bağlantı kurulana kadar sonraki kod satırlarının yürütülmediğinden emin olmak için ASP.NET 4.5 zaman uyumsuz bir yöntemde veya .Wait() zaman uyumlu bir yöntemde kullanınawait. WinRT istemcisinde kullanmayın .Wait() .

await connection.Start();
connection.Start().Wait();

Silverlight istemcilerinden etki alanları arası bağlantılar

Silverlight istemcilerinden etki alanları arası bağlantıları etkinleştirme hakkında bilgi için bkz. Bir Hizmeti Etki Alanı Sınırları Arasında Kullanılabilir Hale Getirme.

Bağlantıyı yapılandırma

Bağlantı kurmadan önce aşağıdaki seçeneklerden herhangi birini belirtebilirsiniz:

  • Eşzamanlı bağlantı sınırı.
  • Sorgu dizesi parametreleri.
  • Aktarım yöntemi.
  • HTTP üst bilgileri.
  • İstemci sertifikaları.

WPF istemcilerinde eş zamanlı bağlantı sayısı üst sınırını ayarlama

WPF istemcilerinde, varsayılan değeri olan 2'den eş zamanlı bağlantı sayısı üst sınırını artırmanız gerekebilir. Önerilen değer 10'dur.

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

Daha fazla bilgi için bkz . ServicePointManager.DefaultConnectionLimit.

Sorgu dizesi parametrelerini belirtme

İstemci bağlandığında sunucuya veri göndermek istiyorsanız, bağlantı nesnesine sorgu dizesi parametreleri ekleyebilirsiniz. Aşağıdaki örnekte, istemci kodunda sorgu dizesi parametresinin nasıl ayarlanacağı gösterilmektedir.

var querystringData = new Dictionary<string, string>();
querystringData.Add("contosochatversion", "1.0");
var connection = new HubConnection("http://contoso.com/", querystringData);

Aşağıdaki örnekte, sunucu kodunda sorgu dizesi parametresinin nasıl okunduğu gösterilmektedir.

public class StockTickerHub : Hub
{
    public override Task OnConnected()
    {
        var version = Context.QueryString["contosochatversion"];
        if (version != "1.0")
        {
            Clients.Caller.notifyWrongVersion();
        }
        return base.OnConnected();
    }
}

Aktarım yöntemini belirtme

Bağlanma işleminin bir parçası olarak SignalR istemcisi normalde sunucuyla anlaşarak hem sunucu hem de istemci tarafından desteklenen en iyi aktarımı belirler. Kullanmak istediğiniz taşımayı zaten biliyorsanız, bu anlaşma sürecini atlayabilirsiniz. Aktarım yöntemini belirtmek için Start yöntemine bir aktarım nesnesi geçirin. Aşağıdaki örnek, istemci kodunda aktarım yönteminin nasıl belirtileceğini gösterir.

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

Microsoft.AspNet.SignalR.Client.Transports ad alanı, aktarımı belirtmek için kullanabileceğiniz aşağıdaki sınıfları içerir.

ForeverFrame aktarımı yalnızca tarayıcılar tarafından kullanıldığından bu listeye dahil değildir.

Sunucu kodunda aktarım yöntemini denetleme hakkında bilgi için bkz. ASP.NET SignalR Hubs API Kılavuzu - Sunucu - Context özelliğinden istemci hakkında bilgi alma. Aktarımlar ve geri dönüşler hakkında daha fazla bilgi için bkz . SignalR'ye Giriş - Aktarımlar ve Geri Dönüşler.

HTTP üst bilgilerini belirtme

HTTP üst bilgilerini ayarlamak için bağlantı nesnesindeki özelliğini kullanın Headers . Aşağıdaki örnekte HTTP üst bilgisinin nasıl ekleneceği gösterilmektedir.

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

İstemci sertifikalarını belirtme

İstemci sertifikaları eklemek için bağlantı nesnesinde yöntemini kullanın AddClientCertificate .

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

Hub proxy'si oluşturma

İstemcide bir Hub'ın sunucudan çağırabileceği yöntemleri tanımlamak ve sunucudaki bir Hub'da yöntemleri çağırmak için, bağlantı nesnesi üzerinde çağırarak CreateHubProxy Hub için bir ara sunucu oluşturun. 'a CreateHubProxy geçirdiğiniz dize, Hub sınıfınızın adı veya sunucuda kullanıldıysa özniteliği tarafından HubName belirtilen addır. Ad eşleştirme büyük/küçük harfe duyarlı değildir.

Sunucudaki hub sınıfı

public class StockTickerHub : Hub

Hub sınıfı için istemci proxy'si oluşturma

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

Hub sınıfınızı bir HubName öznitelikle süslerseniz bu adı kullanın.

Sunucudaki hub sınıfı

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

Hub sınıfı için istemci proxy'si oluşturma

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

Aynı hubNameile birden çok kez çağırırsanız HubConnection.CreateHubProxy aynı önbelleğe alınmış IHubProxy nesneyi alırsınız.

İstemcide sunucunun çağırabileceği yöntemleri tanımlama

Sunucunun çağırabileceği bir yöntem tanımlamak için proxy'nin On yöntemini kullanarak olay işleyicisini kaydedin.

Yöntem adı eşleştirme büyük/küçük harfe duyarlı değildir. Örneğin, Clients.All.UpdateStockPrice sunucuda , updatestockpriceveya UpdateStockPrice istemcisinde yürütülürupdateStockPrice.

Kullanıcı arabirimini güncelleştirmek için yöntem kodu yazmanıza yönelik farklı istemci platformları farklı gereksinimlere sahiptir. Gösterilen örnekler WinRT (Windows Mağazası .NET) istemcileri içindir. WPF, Silverlight ve konsol uygulaması örnekleri bu konunun ilerleyen bölümlerinde ayrı bir bölümde verilmiştir.

Parametresiz yöntemler

İşleme yaptığınız yöntemin parametreleri yoksa, yönteminin genel olmayan aşırı yüklemesini On kullanın:

Parametre olmadan istemci yöntemini çağıran sunucu kodu

public class StockTickerHub : Hub
{
    public void NotifyAllClients()
    {
         Clients.All.Notify();
    }
}

Parametreler olmadan sunucudan çağrılan yöntem için WinRT İstemci kodu (bu konunun devamında WPF ve Silverlight örneklerine bakın)

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

Parametre türlerini belirten parametreler içeren yöntemler

İşlediğiniz yöntemin parametreleri varsa, parametre türlerini yöntemin genel türleri On olarak belirtin. En fazla 8 parametre belirtmenizi sağlayan yöntemin On genel aşırı yüklemeleri vardır (Windows Phone 7'de 4). Aşağıdaki örnekte yöntemine UpdateStockPrice bir parametre gönderilir.

Bir parametre ile istemci yöntemini çağıran sunucu kodu

public void BroadcastStockPrice(Stock stock)
{
    context.Clients.Others.UpdateStockPrice(stock);
}

parametresi için kullanılan Stock sınıfı

public class Stock
{
    public string Symbol { get; set; }
    public decimal Price { get; set; }
}

Parametresiyle sunucudan çağrılan bir yöntem için WinRT İstemci kodu (bu konunun devamında YER alan WPF ve Silverlight örneklerine bakın)

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

Parametreler için dinamik nesneler belirterek parametreleri olan yöntemler

Parametreleri yöntemin genel türleri olarak belirtmeye On alternatif olarak, parametreleri dinamik nesneler olarak belirtebilirsiniz:

Bir parametre ile istemci yöntemini çağıran sunucu kodu

public void BroadcastStockPrice(Stock stock)
{
    context.Clients.Others.UpdateStockPrice(stock);
}

parametresi için kullanılan Stock sınıfı

public class Stock
{
    public string Symbol { get; set; }
    public decimal Price { get; set; }
}

Parametresi için dinamik bir nesne kullanan, parametresi olan sunucudan çağrılan bir yöntem için WinRT İstemci kodu (bu konunun devamında WPF ve Silverlight örneklerine bakın)

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

İşleyiciyi kaldırma

bir işleyiciyi kaldırmak için yöntemini çağırabilirsiniz Dispose .

Sunucudan çağrılan bir yöntemin istemci kodu

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

İşleyiciyi kaldırmak için istemci kodu

updateStockPriceHandler.Dispose();

İstemciden sunucu yöntemlerini çağırma

Sunucuda bir yöntemi çağırmak için Hub proxy'sinde yöntemini kullanın Invoke .

Sunucu yönteminin dönüş değeri yoksa, yönteminin genel olmayan aşırı yüklemesini Invoke kullanın.

Dönüş değeri olmayan bir yöntemin sunucu kodu

public class StockTickerHub : Hub
{
    public void JoinGroup(string groupName)
    {
        Groups.Add(Context.ConnectionId, groupName); 
    }
}

Dönüş değeri olmayan bir yöntemi çağıran istemci kodu

stockTickerHubProxy.Invoke("JoinGroup", "SignalRChatRoom");

Sunucu yönteminin dönüş değeri varsa, dönüş türünü yöntemin genel türü Invoke olarak belirtin.

Dönüş değeri olan ve karmaşık tür parametresi alan bir yöntemin sunucu kodu

public IEnumerable<Stock> AddStock(Stock stock)
{
    _stockTicker.AddStock(stock);
    return _stockTicker.GetAllStocks();
}

Parametre ve dönüş değeri için kullanılan Stock sınıfı

public class Stock
{
    public string Symbol { get; set; }
    public decimal Price { get; set; }
}

dönüş değerine sahip olan ve ASP.NET 4.5 zaman uyumsuz yönteminde karmaşık tür parametresi alan bir yöntemi çağıran istemci kodu

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

Dönüş değerine sahip olan ve zaman uyumlu bir yöntemde karmaşık tür parametresi alan bir yöntemi çağıran istemci kodu

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

Invoke yöntemi zaman uyumsuz olarak yürütülür ve bir Task nesne döndürür. veya .Wait()belirtmezsenizawait, çağırdığınız yöntemin yürütülmesi tamamlanmadan önce bir sonraki kod satırı yürütülür.

Bağlantı ömrü olaylarını işleme

SignalR, işleyebileceğiniz aşağıdaki bağlantı ömrü olaylarını sağlar:

  • Received: Bağlantı üzerinde herhangi bir veri alındığında oluşturulur. Alınan verileri sağlar.
  • ConnectionSlow: İstemci yavaş veya sık sık kesilen bir bağlantı algıladığında tetikler.
  • Reconnecting: Temel alınan aktarım yeniden bağlanmaya başladığında tetikler.
  • Reconnected: Temel alınan aktarım yeniden bağlandığında tetiklendi.
  • StateChanged: Bağlantı durumu değiştiğinde tetiklenen. Eski durumu ve yeni durumu sağlar. Bağlantı durumu değerleri hakkında bilgi için bkz. ConnectionState Numaralandırması.
  • Closed: Bağlantı kesildiğinde tetiklendi.

Örneğin, önemli olmayan ancak yavaşlama veya bağlantının sık sık bırakması gibi aralıklı bağlantı sorunlarına neden olan hatalar için uyarı iletileri görüntülemek istiyorsanız, olayı işleyin ConnectionSlow .

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

Daha fazla bilgi için bkz. SignalR'de Bağlantı Ömrü Olaylarını Anlama ve İşleme.

Hataları işleme

Sunucuda ayrıntılı hata iletilerini açıkça etkinleştirmezseniz, SignalR'nin hatadan sonra döndürdüğü özel durum nesnesi hata hakkında en az bilgi içerir. Örneğin, bir çağrısı newContosoChatMessage başarısız olursa, hata nesnesindeki hata iletisi "There was an error invoking Hub method 'contosoChatHub.newContosoChatMessage'." içerir. Üretimdeki istemcilere ayrıntılı hata iletileri gönderme güvenlik nedenleriyle önerilmez, ancak sorun giderme amacıyla ayrıntılı hata iletilerini etkinleştirmek istiyorsanız, sunucuda aşağıdaki kodu kullanın.

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

SignalR'nin neden olduğu hataları işlemek için bağlantı nesnesine Error olay için bir işleyici ekleyebilirsiniz.

hubConnection.Error += ex => Console.WriteLine("SignalR error: {0}", ex.Message);

Yöntem çağrılarındaki hataları işlemek için kodu try-catch bloğuna sarmalayın.

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

İstemci tarafı günlüğünü etkinleştirme

İstemci tarafı günlüğünü etkinleştirmek için bağlantı nesnesinde TraceLevel ve TraceWriter özelliklerini ayarlayın.

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

Sunucunun çağırabileceği istemci yöntemleri için WPF, Silverlight ve konsol uygulama kodu örnekleri

Sunucunun çağırabileceği istemci yöntemlerini tanımlamak için daha önce gösterilen kod örnekleri WinRT istemcilerine uygulanır. Aşağıdaki örneklerde WPF, Silverlight ve konsol uygulaması istemcileri için eşdeğer kod gösterilmektedir.

Parametresiz yöntemler

Parametreler olmadan sunucudan çağrılan yöntem için WPF istemci kodu

stockTickerHub.On<Stock>("notify", () =>
    Dispatcher.InvokeAsync(() =>
        {
            SignalRTextBlock.Text += string.Format("Notified!");
        })
);

Parametreler olmadan sunucudan çağrılan yöntem için Silverlight istemci kodu

stockTickerHub.On<Stock>("notify", () =>
    // Context is a reference to SynchronizationContext.Current
    Context.Post(delegate
    {
        textBox.Text += "Notified!";
    }, null)
);

Parametreler olmadan sunucudan çağrılan yöntem için konsol uygulaması istemci kodu

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

Parametre türlerini belirten parametreler içeren yöntemler

Bir parametre ile sunucudan çağrılan bir yöntem için WPF istemci kodu

stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => 
    Dispatcher.InvokeAsync(() =>
        {
            textBox.Text += string.Format("Stock update for {0} new price {1}\n", stock.Symbol, stock.Price);
        })
);

Parametresiyle sunucudan çağrılan bir yöntem için Silverlight istemci kodu

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

Bir parametre ile sunucudan çağrılan bir yöntem için konsol uygulaması istemci kodu

stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => 
    Console.WriteLine("Symbol {0} Price {1}", stock.Symbol, stock.Price));

Parametreler için dinamik nesneler belirterek parametreleri olan yöntemler

Parametresi için dinamik bir nesne kullanan, parametresiyle sunucudan çağrılan bir yöntem için WPF istemci kodu

stockTickerHubProxy.On("UpdateStockPrice", stock => 
    Dispatcher.InvokeAsync(() =>
        {
            textBox.Text += string.Format("Stock update for {0} new price {1}\n", stock.Symbol, stock.Price);
        })
);

Parametresi için dinamik bir nesne kullanan, parametresiyle sunucudan çağrılan yöntemin Silverlight istemci kodu

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

Parametre için dinamik bir nesne kullanan, parametresiyle sunucudan çağrılan bir yöntemin konsol uygulaması istemci kodu

stockTickerHubProxy.On("UpdateStockPrice", stock => 
    Console.WriteLine("Symbol {0} Price {1}", stock.Symbol, stock.Price));