ASP.NET SignalR hub 'Ları API Kılavuzu-.NET Istemcisi (SignalR 1. x)

by Patrick Fletu, Tom Dykstra

Warning

Bu belge, SignalR 'nin en son sürümü için değildir. ASP.NET Core SignalR'ye göz atın.

Bu belge, .NET istemcilerindeki SignalR sürüm 2 için Windows Mağazası (WinRT), WPF, Silverlight ve konsol uygulamaları gibi hub API 'leri kullanma hakkında bir giriş sağlar.

SignalR hub 'Ları API 'SI, uzak yordam çağrılarını (RPC) bir sunucudan, istemcilerden ve istemcilerden sunucuya bağlı hale getirmenizi sağlar. Sunucu kodu ' nda, istemciler tarafından çağrılabilen Yöntemler tanımlar ve istemcide çalışan yöntemleri çağırabilirsiniz. İstemci kodunda, sunucudan çağrılabilen yöntemleri tanımlayabilir ve sunucuda çalışan yöntemleri çağırabilirsiniz. SignalR, sizin için istemciden sunucuya sıhhi kını ele alır.

SignalR Ayrıca kalıcı bağlantılar adlı alt düzey bir API sunar. SignalR, hub 'Lar ve sürekli bağlantılara giriş veya tam bir SignalR uygulamasının nasıl oluşturulduğunu 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:

Sunucu veya JavaScript istemcilerini programmaya yönelik belgeler için aşağıdaki kaynaklara bakın:

API başvuru konularına bağlantılar, API 'nin .NET 4,5 sürümüdür. .NET 4 kullanıyorsanız, API konularının .NET 4 sürümünebakın.

İstemci kurulumu

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

İstemci üzerindeki SignalR sürümü, sunucuda sahip olduğunuz sürümden farklıysa, SignalR genellikle farka uyum sağlayabilir. Örneğin, SignalR sürüm 2,0 yayımlanmışsa ve sunucuya yüklüyorsanız, sunucu 1.1. x yüklü olan istemcileri ve 2,0 yüklü istemcileri destekleyecektir. Sunucu üzerindeki sürüm ve istemcideki sürüm arasındaki fark çok harika ise, istemci bir bağlantı kurmaya çalıştığında SignalR bir InvalidOperationException özel durumu 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

Bir bağlantı kurmadan önce, bir HubConnection nesnesi oluşturmanız ve proxy oluşturmanız gerekir. Bağlantıyı kurmak için HubConnection nesnesinde Start yöntemini çağırın.

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

Note

JavaScript istemcileri için, bağlantıyı kurmak üzere Start yöntemini çağırmadan önce en az bir olay işleyicisini kaydetmeniz gerekir. .NET istemcileri için bu gerekli değildir. JavaScript istemcileri için, oluşturulan proxy kodu, sunucuda var olan tüm Hub 'Lar için otomatik olarak proxy oluşturur ve bir işleyiciyi kaydetmek, istemcinizin hangi hub 'Ları kullandığını belirtebilmeniz anlamına gelir. Ancak, bir .NET istemcisi için hub proxy 'leri el ile oluşturursunuz. SignalR, için proxy oluşturduğunuz herhangi bir hub kullandığı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 daha fazla bilgi için bkz. ASP.NET SignalR hub 'LARı API Kılavuzu-sunucu-/SignalR URL 'si.

Start yöntemi zaman uyumsuz olarak yürütülür. Sonraki kod satırlarının bağlantı kurulana kadar yürütülmediği konusunda emin olmak için, bir ASP.NET 4,5 zaman uyumsuz yönteminde await kullanın veya zaman uyumlu bir yöntemde .Wait(). WinRT istemcisinde .Wait() kullanmayın.

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 daha fazla bilgi için bkz. bir hizmeti etki alanı sınırları genelinde kullanılabilir hale getirme.

Bağlantıyı yapılandırma

Bir 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 üstbilgileri.
  • İstemci sertifikaları.

WPF istemcilerinde en fazla eşzamanlı bağlantı sayısını ayarlama

WPF istemcilerinde, en fazla eş zamanlı bağlantı sayısını varsayılan 2 değerinden 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ığı zaman sunucuya veri göndermek istiyorsanız, bağlantı nesnesine sorgu dizesi parametreleri ekleyebilirsiniz. Aşağıdaki örnekte, istemci kodunda bir 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 örnek, sunucu kodundaki bir sorgu dizesi parametresinin nasıl okunacağını gösterir.

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

Taşıma yöntemini belirtme

Bağlantı sürecinin bir parçası olarak, bir SignalR istemcisi normalde sunucu ve istemci tarafından desteklenen en iyi aktarımı tespit etmek üzere sunucuyla görüşür. Kullanmak istediğiniz taşımayı zaten biliyorsanız, bu anlaşma işlemini atlayabilirsiniz. Taşıma yöntemini belirtmek için, başlangıç yöntemine bir taşıma nesnesi geçirin. Aşağıdaki örnek, istemci kodunda taşıma yönteminin nasıl kullanılacağını 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. taşımalar ad alanı, taşımayı belirtmek için kullanabileceğiniz aşağıdaki sınıfları içerir.

  • LongPollingTransport
  • ServerSentEventsTransport
  • Websockettransport (yalnızca hem sunucu hem de istemci .NET 4,5 ' i kullanırken kullanılabilir.)
  • Otomatik Aktarım (hem istemci hem de sunucu tarafından desteklenen en iyi aktarımı otomatik olarak seçer. Bu, varsayılan aktarımdır. Bunu Start yöntemine geçirmek, hiçbir şeyi geçirmeyen aynı etkiye sahiptir.)

Yalnızca tarayıcılar tarafından kullanıldığından, ForeverFrame taşıması bu listeye dahil edilmez.

Sunucu kodundaki aktarım yöntemini denetleme hakkında daha fazla bilgi için bkz. ASP.NET SignalR hub 'LARı API Kılavuzu-sunucu-bağlam özelliğinden istemci hakkında bilgi alma. Aktarımlar ve geri göndermeler hakkında daha fazla bilgi için bkz. SignalR 'ye giriş-aktarımlar ve geri göndermeler.

HTTP üst bilgilerini belirtme

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

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ı nesnesindeki AddClientCertificate yöntemini 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();

Merkez proxy oluşturma

İstemcideki bir hub 'ın sunucudan çağırabildiği ve sunucudaki bir hub 'da Yöntemler çağırabileceği yöntemleri tanımlamak için bağlantı nesnesi üzerinde CreateHubProxy çağırarak Hub için bir ara sunucu oluşturun. CreateHubProxy ' a geçirdiğiniz dize, hub sınıfınızın adı veya sunucu üzerinde bir tane kullanılmışsa HubName özniteliğiyle belirtilen addır. Ad eşleştirme büyük küçük harfe duyarlıdır.

Sunucudaki hub sınıfı

public class StockTickerHub : Hub

Hub sınıfı için istemci ara sunucusu 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 özniteliğiyle süslemek istiyorsanız, bu adı kullanın.

Sunucudaki hub sınıfı

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

Hub sınıfı için istemci ara sunucusu 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 HubConnection.CreateHubProxy aynı hubNamebirden çok kez çağırırsanız, önbelleğe alınmış IHubProxy nesnesini alırsınız.

İstemcide sunucunun çağırabir yöntemi tanımlama

Sunucunun çağırakullanabileceği bir yöntemi tanımlamak için, bir olay işleyicisini kaydetmek üzere proxy 'nin On yöntemini kullanın.

Yöntem adı eşleştirme, büyük/küçük harfe duyarlıdır. Örneğin, sunucusundaki Clients.All.UpdateStockPrice, istemcide updateStockPrice, updatestockpriceveya UpdateStockPrice yürütülür.

Farklı istemci platformları, Kullanıcı arabirimini güncelleştirmek için yöntem kodu yazma konusunda farklı gereksinimlere sahiptir. Gösterilen örnekler, WinRT (Windows Mağazası .NET) istemcileri içindir. WPF, Silverlight ve konsol uygulaması örnekleri, Bu konunun ilerleyen kısımlarında ayrı bir bölümdesunulmaktadır.

Parametreleri olmayan 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 Istemci kodu (Bu konunun ilerleyen kısımlarında bulunan 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 belirterek parametreleri olan Yöntemler

İşlemekte olduğunuz yöntemin parametreleri varsa, On yönteminin genel türleri olarak parametre türlerini belirtin. 8 ' e kadar parametre belirtmenizi sağlayan On yönteminin genel aşırı yüklemeleri vardır (Windows Phone 7 üzerinde 4). Aşağıdaki örnekte, UpdateStockPrice yöntemine bir parametre gönderilir.

İstemci yöntemini bir parametre ile çağıran sunucu kodu

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

Parametresi için kullanılan hisse senedi sınıfı

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

Parametresi ile sunucudan çağrılan bir yöntem için WinRT Istemci kodu (Bu konunun ilerleyen kısımlarında yer alarak 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)
);

Parametreleri için dinamik nesneler belirten parametrelere sahip Yöntemler

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

İstemci yöntemini bir parametre ile çağıran sunucu kodu

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

Parametresi için kullanılan hisse senedi sınıfı

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

Parametresi için dinamik bir nesne kullanan ve parametresi için bir parametre içeren sunucudan çağrılan bir yöntem için WinRT Istemci kodu (Bu konunun ilerleyen kısımlarında yer almaktadır WPF ve Silverlight örnekleri)

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şleyiciyi kaldırma

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

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 üzerinde Invoke yöntemi kullanın.

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

Dönüş değeri olmayan bir yöntem için 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 bir dönüş değeri varsa, dönüş türünü Invoke yönteminin genel türü olarak belirtin.

Dönüş değerine sahip ve karmaşık bir tür parametresi alan bir yöntem için sunucu kodu

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

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

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

Bir ASP.NET 4,5 zaman uyumsuz yönteminde dönüş değeri olan ve 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);
}

Bir dönüş değeri olan ve bir karmaşık tür parametresi alan ve bir zaman uyumlu yöntemde olan 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üyor. await veya .Wait()belirtmezseniz, bir sonraki kod satırı, çağırabileceğiniz yöntemin yürütmeyi bitirinceye kadar yürütülür.

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

SignalR, işleyebilmeniz için aşağıdaki bağlantı ömrü olaylarını sağlar:

  • Received: bağlantıda herhangi bir veri alındığında tetiklenir. Alınan verileri sağlar.
  • ConnectionSlow: istemci yavaş veya sık bir bırakma bağlantısı algıladığında tetiklenir.
  • Reconnecting: temeldeki aktarım yeniden bağlanmaya başladığında tetiklenir.
  • Reconnected: temeldeki aktarım yeniden bağlandığında tetiklenir.
  • StateChanged: bağlantı durumu değiştiğinde tetiklenir. Eski durumu ve yeni durumu sağlar. Bağlantı durumu değerleri hakkında daha fazla bilgi için bkz. ConnectionState numaralandırması.
  • Closed: bağlantının bağlantısı kesildiğinde tetiklenir.

Örneğin, önemli olmayan hatalar için uyarı iletileri göstermek istiyorsanız, ancak bağlantının yavaşlılığını veya sık olarak düşürülmesi gibi aralıklı bağlantı sorunlarına neden olursa ConnectionSlow olayını işleyin.

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

Daha fazla bilgi için bkz. SignalR 'de bağlantı ömrü olaylarını anlama ve işleme.

Hataları işleme

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

var hubConfiguration = new HubConfiguration();
hubConfiguration.EnableDetailedErrors = true;
RouteTable.Routes.MapHubs(hubConfiguration);

SignalR 'nin yükselten hataları işlemek için bağlantı nesnesi üzerinde Error olayı için bir işleyici ekleyebilirsiniz.

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

Yöntem etkinleştirmeleri içindeki hataları işlemek için, kodu bir try-catch bloğunda sarı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ük kaydını etkinleştirme

İstemci tarafı günlük kaydını etkinleştirmek için, bağlantı nesnesindeki 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ğıra, istemci yöntemleri için WPF, Silverlight ve konsol uygulama kodu örnekleri

Daha önce sunucunun, WinRT istemcilerine uygulama çağırabilecek istemci yöntemleri tanımlamak için gösterilen kod örnekleri. Aşağıdaki örnekler WPF, Silverlight ve konsol uygulama istemcileri için eşdeğer kodu gösterir.

Parametreleri olmayan Yöntemler

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

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

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

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

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

Parametre türlerini belirterek parametreleri olan 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);
        })
);

Bir parametre ile 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));

Parametreleri için dinamik nesneler belirten parametrelere sahip Yöntemler

Parametresi için dinamik bir nesne kullanarak, bir 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 kullanarak, bir 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 kullanarak, bir parametresiyle sunucudan çağrılan bir yöntemin konsol uygulama istemci kodu

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