Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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
- Visual Studio 2017
- .NET 4.5
- SignalR sürüm 2
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:
- gustavo-armenta / SignalR-Samples on GitHub.com (WinRT, Silverlight, konsol uygulaması örnekleri).
- GitHub.com'da DamianEdwards / SignalR-MoveShapeDemo / MoveShape.Desktop (WPF örneği).
- SignalR / GitHub.com üzerinde Microsoft.AspNet.SignalR.Client.Samples (Konsol uygulaması örneği).
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.
- LongPollingTransport
- ServerSentEventsTransport
- WebSocketTransport (Yalnızca hem sunucu hem de istemci .NET 4.5 kullandığında kullanılabilir.)
-
AutoTransport (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
Startgeçirmek, hiçbir şey geçirmemekle aynı etkiye sahiptir.)
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));