Aracılığıyla paylaş


ASP.NET SignalR Hubs API Kılavuzu - .NET İstemcisi (SignalR 1.x)

Patrick Fletcher, Tom Dykstra tarafından

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.

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.0 yayınlandığında ve bunu sunucuya yüklediğinizde, sunucu 1.1.x yüklü istemcilerin yanı sıra 2.0 yüklü istemcileri de destekler. Sunucudaki sürümle istemcideki sürüm arasındaki fark çok büyükse, 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 .

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

HubConnection sınıfı iş parçacığı güvenlidir.

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.

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.

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ı nesnesini ç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 ö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

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

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

Proxy nesnesi iş parçacığı güvenlidir. Aslında, aynı hubNameile birden çok kez çağırırsanızHubConnection.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 bir olay işleyicisi 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 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, yöntemin 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 yer alan WPF ve Silverlight örneklerine bakın)

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 parametrelere sahip yöntemler

İşlediğiniz yöntemin parametreleri varsa, parametre türlerini yöntemin genel türleri On olarak belirtin. yönteminde On en fazla 8 parametre (Windows Phone 7'de 4) belirtmenize olanak tanıyan genel aşırı yüklemeler vardır. 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 belirten parametrelere sahip 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)
);

İş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öntemin 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", hubConnection.ConnectionID, "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 nesnesi 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ıda 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 oluşturulur. Eski durumu ve yeni durumu sağlar. Bağlantı durumu değerleri hakkında bilgi için bkz. ConnectionState Sabit Listesi.
  • Closed: Bağlantı kesildiğinde tetiklendi.

Örneğin, önemli olmayan ancak bağlantının yavaş olması veya sık sık düşmesi 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. Güvenlik nedenleriyle üretimdeki istemcilere ayrıntılı hata iletileri gönderilmesi ö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;
RouteTable.Routes.MapHubs(hubConfiguration);

SignalR tarafından oluşturulan 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.

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

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

Parametresiyle 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 parametrelere sahip yöntemler

Parametre 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, parametresi olan sunucudan çağrılan yöntemin konsol uygulaması istemci kodu

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