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. 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.
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 belgede aşağıdaki bölümler yer alır:
Örnek bir .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 üzerinde 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 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 ç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 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 Start
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();
}
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();
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.
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 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.
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
Start
geç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. 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ı nesnesi üzerinde çağırarak CreateHubProxy
Hub için bir ara sunucu oluşturun. 'a CreateHubProxy
geçirdiğiniz 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
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ı hubName
ile birden çok kez çağırırsanız HubConnection.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 olay işleyicisini kaydedin.
Yöntem adı eşleştirme büyük/küçük harfe duyarlı değildir. Örneğin, Clients.All.UpdateStockPrice
sunucuda , updatestockprice
veya UpdateStockPrice
istemcisinde yürütülürupdateStockPrice
.
Kullanıcı arabirimini güncelleştirmek için yöntem kodu yazmanıza 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
İşleme yaptığınız yöntemin parametreleri yoksa, yönteminin 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 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. En fazla 8 parametre belirtmenizi sağlayan yöntemin On
genel aşırı yüklemeleri vardır (Windows Phone 7'de 4). 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 belirterek parametreleri olan 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 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önteminin 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", "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
nesne 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ı üzerinde 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 tetiklenen. 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 tetiklendi.
Örneğin, önemli olmayan ancak yavaşlama veya bağlantının sık sık bırakması 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. Üretimdeki istemcilere ayrıntılı hata iletileri gönderme güvenlik nedenleriyle ö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'nin neden olduğu 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.
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
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 parametreler içeren 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)
);
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));
Parametreler için dinamik nesneler belirterek parametreleri olan 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 yöntemin 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)
);
Parametre için dinamik bir nesne kullanan, parametresiyle sunucudan çağrılan bir yöntemin konsol uygulaması istemci kodu
stockTickerHubProxy.On("UpdateStockPrice", stock =>
Console.WriteLine("Symbol {0} Price {1}", stock.Symbol, stock.Price));