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. ASP.NET Core SignalR'ye 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'leri, bir sunucudan bağlı istemcilere ve istemcilerden sunucuya uzaktan yordam çağrıları (RPC' ler) yapmanıza olanak tanır. Sunucu kodunda, istemciler tarafından çağrılabilecek yöntemler tanımlarsınız ve istemcide çalışan yöntemleri çağırırsınız. İstemci kodunda, sunucudan çağrılabilecek yöntemler 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ş için veya eksiksiz bir SignalR uygulamasının nasıl oluşturulacağını 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 belge aşağıdaki bölümleri içerir:

Örnek .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 Referans konularına yapılan bağlantılar, API'nin .NET 4.5 sürümüne yöneliktir. .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 paketi 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 uyarlanabilir. Ö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 iletisidirYou 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 HubConnection nesne oluşturmanız ve bir ara sunucu oluşturmanız gerekir. Bağlantıyı kurmak için HubConnection nesnesinde Start yöntemini çağırın.

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

Uyarı

JavaScript istemcileri için, bağlantıyı kurmak için yöntemini çağırmadan Start önce en az bir olay işleyicisi kaydetmeniz gerekir. .NET istemcileri için bu gerekli değildir. JavaScript istemcileri için oluşturulan proxy 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ülmesini engellemek için, ASP.NET 4.5 zaman uyumsuz bir yöntemde await veya zaman uyumlu bir yöntemde .Wait() kullanın. WinRT istemcisinde kullanmayın .Wait() .

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

Silverlight istemcilerinin 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.
  • Taşıma 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 olan en fazla eşzamanlı bağlantı sayısı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 hem sunucu hem de istemci tarafından desteklenen en iyi aktarımı belirlemek için normalde sunucuyla anlaşma sağlar. Kullanmak istediğiniz taşımayı zaten biliyorsanız, bu anlaşma işlemini 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. Taşımalar 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 nasıl belirtirsiniz

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 AddClientCertificate yöntemini bağlantı nesnesinde kullanın.

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. Geçirdiğiniz CreateHubProxy dize, Hub sınıfınızın adı veya sunucuda kullanıldıysa HubName özelliği tarafından belirtilen addır. İsim eşleştirme büyük/küçük harfe duyarsızdır.

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ı HubConnection.CreateHubProxyile birden çok kez çağırırsanızhubName, 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 bir olay işleyicisi kaydedin.

Yöntem adı eşleştirme büyük/küçük harfe duyarsızdır. Örneğin, Clients.All.UpdateStockPrice sunucuda updateStockPrice, updatestockprice veya UpdateStockPrice istemcide çalıştırılacak.

Kullanıcı arabirimini güncelleştirmek için yöntem kodu yazma yönteminize 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

İşlemekte olduğunuz yöntemin parametreleri yoksa, On yönteminin genel olmayan aşırı yüklemesini kullanın.

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

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

Parametresiz sunucudan çağrılan yöntem için WinRT İstemci kodu (bu konunun devamında yer alan 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. 8 parametreye kadar belirtmenizi sağlayan On yönteminin genel aşırı yüklemeleri vardır (Windows Phone 7'de 4). Aşağıdaki örnekte, UpdateStockPrice yöntemine bir parametre gönderiliyor.

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 olan 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 belirten parametreler içeren 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 YER alan 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)
);

Bir işleyici nasıl kaldırılır?

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

Sunucudan çağrılan bir yöntem için 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'si üzerinde Invoke yöntemini kullanın.

Sunucu yönteminin dönüş değeri yoksa, genel olmayan Invoke aşırı yüklemesini 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ğeri olan ve karmaşık tür parametresi kabul eden bir yöntemi ASP.NET 4.5 zaman uyumsuz yönteminde ç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);
}

Bir dönüş değerine sahip olan ve karmaşık tür parametresi alan bir yöntemi, zaman uyumlu bir yöntemde ç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 awaitbelirtmezseniz.Wait(), ç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ıdan herhangi bir veri alındığında tetiklenir. Alınan verileri sağlar.
  • ConnectionSlow: İstemci yavaş çalışan veya sık sık kopan bir bağlantı algıladığında tetiklenir.
  • Reconnecting: Altyapı iletişimi yeniden bağlanmaya başladığında tetiklenir.
  • Reconnected: Altta yatan aktarım yeniden bağlandığında oluşur.
  • StateChanged: Bağlantı durumu değiştiğinde yükseltildi. 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 yükseltilir.

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

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ı 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 nedeniyle ö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'ın tetiklediği 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ü nasıl etkinleştirebilirim?

İ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

Parametresiz 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

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

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

Parametresi olan 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 belirten parametreler içeren 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 bir yöntem için 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)
);

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

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