ASP.NET SignalR hub 'Ları API Kılavuzu-.NET Istemcisi (C#)

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.

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

Bu konunun önceki sürümleri

SignalR 'nin önceki sürümleri hakkında daha fazla bilgi için bkz. SignalR daha eski sürümleri.

Sorular ve açıklamalar

Lütfen bu öğreticiyi nasıl beğentireceğiniz ve sayfanın en altındaki açıklamalarda İyileştiğimiz hakkında geri bildirimde bulunun. Öğreticiyle doğrudan ilgili olmayan sorularınız varsa, bunları ASP.NET SignalR forumuna veya StackOverflow.com'e 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:

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 çalıştıran bir sunucu, 1.1. x yüklü olan istemcileri ve sürüm 2 ' nin yüklü olduğu İstemcileri destekleyecektir. Sunucu üzerindeki sürüm ile istemcideki sürüm arasındaki fark çok harika ise veya istemci sunucudan daha yeniyse, InvalidOperationException istemci bir bağlantı kurmaya çalıştığında SignalR bir ö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

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

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

Note

JavaScript istemcileri için, Start bağlantıyı kurmak üzere 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.

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

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

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

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. 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 yöntemine geçirmek, Start 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 Headers bağlantı nesnesindeki ö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 AddClientCertificate bağlantı nesnesindeki 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ı nesnesini çağırarak Hub için bir ara sunucu oluşturun CreateHubProxy . ' A geçirdiğiniz dize, CreateHubProxy hub sınıfınızın adı veya HubName bir sunucu üzerinde kullanılmışsa öznitelik tarafından 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

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 özniteliğiyle süslemek istiyorsanız HubName , 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

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

HubConnection.CreateHubProxyAynı ile birden çok kez çağrı yaparsanız hubName , aynı önbelleğe alınmış IHubProxy nesneyi alırsınız.

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

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

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

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, yöntemin genel olmayan aşırı yüklemesini kullanın On :

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)

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 belirterek parametreleri olan Yöntemler

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

İ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

Yöntemin genel türleri olarak parametre belirtmeye alternatif olarak On , 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 Invoke hub proxy üzerinde yöntemi kullanın.

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

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", "SignalRChatRoom");

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

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

InvokeYöntemi zaman uyumsuz olarak yürütülür ve bir Task nesne döndürür. awaitYa da belirtmezseniz .Wait() , 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: İstemci yavaş veya sık 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ı 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, bir çağrı newContosoChatMessage başarısız olursa, hata nesnesindeki hata iletisi, There was an error invoking Hub method 'contosoChatHub.newContosoChatMessage'. Güvenlik nedenleriyle, üretimde istemcilere ayrıntılı hata iletileri gönderilmesi önerilmez, 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;
App.MapSignalR(hubConfiguration);

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

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, TraceLevel TraceWriter bağlantı nesnesindeki ve ö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ğı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));