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

by Patrick Fletu, Tom Dykstraby Patrick Fletcher, Tom Dykstra

Warning

Bu belge, SignalR 'nin en son sürümü için değildir.This documentation isn't for the latest version of SignalR. ASP.NET Core SignalR'ye göz atın.Take a look at ASP.NET Core SignalR.

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.This document provides an introduction to using the Hubs API for SignalR version 2 in .NET clients, such as Windows Store (WinRT), WPF, Silverlight, and console applications.

SignalR hub 'Ları API 'SI, uzak yordam çağrılarını (RPC) bir sunucudan, istemcilerden ve istemcilerden sunucuya bağlı hale getirmenizi sağlar.The SignalR Hubs API enables you to make remote procedure calls (RPCs) from a server to connected clients and from clients to the server. Sunucu kodu ' nda, istemciler tarafından çağrılabilen Yöntemler tanımlar ve istemcide çalışan yöntemleri çağırabilirsiniz.In server code, you define methods that can be called by clients, and you call methods that run on the client. İstemci kodunda, sunucudan çağrılabilen yöntemleri tanımlayabilir ve sunucuda çalışan yöntemleri çağırabilirsiniz.In client code, you define methods that can be called from the server, and you call methods that run on the server. SignalR, sizin için istemciden sunucuya sıhhi kını ele alır.SignalR takes care of all of the client-to-server plumbing for you.

SignalR Ayrıca kalıcı bağlantılar adlı alt düzey bir API sunar.SignalR also offers a lower-level API called Persistent Connections. 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.For an introduction to SignalR, Hubs, and Persistent Connections, or for a tutorial that shows how to build a complete SignalR application, see SignalR - Getting Started.

Genel bakışOverview

Bu belgede aşağıdaki bölümler yer alır:This document contains the following sections:

Örnek bir .NET istemci projeleri için aşağıdaki kaynaklara bakın:For a sample .NET client projects, see the following resources:

Sunucu veya JavaScript istemcilerini programmaya yönelik belgeler için aşağıdaki kaynaklara bakın:For documentation on how to program the server or JavaScript clients, see the following resources:

API başvuru konularına bağlantılar, API 'nin .NET 4,5 sürümüdür.Links to API Reference topics are to the .NET 4.5 version of the API. .NET 4 kullanıyorsanız, API konularının .NET 4 sürümünebakın.If you're using .NET 4, see the .NET 4 version of the API topics.

İstemci kurulumuClient setup

Microsoft. Aspnet. SignalR. Client NuGet paketini ( Microsoft. Aspnet. SignalR paketini değil) yükler.Install the Microsoft.AspNet.SignalR.Client NuGet package (not the Microsoft.AspNet.SignalR package). Bu paket, .NET 4 ve .NET 4,5 için WinRT, Silverlight, WPF, konsol uygulaması ve Windows Phone istemcilerini destekler.This package supports WinRT, Silverlight, WPF, console application, and Windows Phone clients, for both .NET 4 and .NET 4.5.

İstemci üzerindeki SignalR sürümü, sunucuda sahip olduğunuz sürümden farklıysa, SignalR genellikle farka uyum sağlayabilir.If the version of SignalR that you have on the client is different from the version that you have on the server, SignalR is often able to adapt to the difference. Ö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.For example, when SignalR version 2.0 is released and you install that on the server, the server will support clients that have 1.1.x installed as well as clients that have 2.0 installed. 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.If the difference between the version on the server and the version on the client is too great, SignalR throws an InvalidOperationException exception when the client tries to establish a connection. 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".The error message is "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ı kurmaHow to establish a connection

Bir bağlantı kurmadan önce, bir HubConnection nesnesi oluşturmanız ve proxy oluşturmanız gerekir.Before you can establish a connection, you have to create a HubConnection object and create a proxy. Bağlantıyı kurmak için HubConnection nesnesinde Start yöntemini çağırın.To establish the connection, call the Start method on the HubConnection object.

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.For JavaScript clients you have to register at least one event handler before calling the Start method to establish the connection. .NET istemcileri için bu gerekli değildir.This is not necessary for .NET clients. 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.For JavaScript clients, the generated proxy code automatically creates proxies for all Hubs that exist on the server, and registering a handler is how you indicate which Hubs your client intends to use. 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.But for a .NET client you create Hub proxies manually, so SignalR assumes that you will be using any Hub that you create a proxy for.

Örnek kod, SignalR hizmetinize bağlanmak için varsayılan "/SignalR" URL 'sini kullanır.The sample code uses the default "/signalr" URL to connect to your SignalR service. 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.For information about how to specify a different base URL, see ASP.NET SignalR Hubs API Guide - Server - The /signalr URL.

Start yöntemi zaman uyumsuz olarak yürütülür.The Start method executes asynchronously. 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().To make sure that subsequent lines of code don't execute until after the connection is established, use await in an ASP.NET 4.5 asynchronous method or .Wait() in a synchronous method. WinRT istemcisinde .Wait() kullanmayın.Don't use .Wait() in a WinRT client.

await connection.Start();
connection.Start().Wait();

HubConnection sınıfı iş parçacığı güvenlidir.The HubConnection class is thread-safe.

Silverlight istemcilerinden etki alanları arası bağlantılarCross-domain connections from Silverlight clients

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.For information about how to enable cross-domain connections from Silverlight clients, see Making a Service Available Across Domain Boundaries.

Bağlantıyı yapılandırmaHow to configure the connection

Bir bağlantı kurmadan önce, aşağıdaki seçeneklerden herhangi birini belirtebilirsiniz:Before you establish a connection, you can specify any of the following options:

  • Eşzamanlı bağlantı sınırı.Concurrent connections limit.
  • Sorgu dizesi parametreleri.Query string parameters.
  • Taşıma yöntemi.The transport method.
  • HTTP üstbilgileri.HTTP headers.
  • İstemci sertifikaları.Client certificates.

WPF istemcilerinde en fazla eşzamanlı bağlantı sayısını ayarlamaHow to set the maximum number of concurrent connections in WPF clients

WPF istemcilerinde, en fazla eş zamanlı bağlantı sayısını varsayılan 2 değerinden artırmanız gerekebilir.In WPF clients, you might have to increase the maximum number of concurrent connections from its default value of 2. Önerilen değer 10 ' dur.The recommended value is 10.

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.For more information, see ServicePointManager.DefaultConnectionLimit.

Sorgu dizesi parametrelerini belirtmeHow to specify query string parameters

İstemci bağlandığı zaman sunucuya veri göndermek istiyorsanız, bağlantı nesnesine sorgu dizesi parametreleri ekleyebilirsiniz.If you want to send data to the server when the client connects, you can add query string parameters to the connection object. Aşağıdaki örnekte, istemci kodunda bir sorgu dizesi parametresinin nasıl ayarlanacağı gösterilmektedir.The following example shows how to set a query string parameter in client code.

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.The following example shows how to read a query string parameter in server code.

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 belirtmeHow to specify the transport method

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.As part of the process of connecting, a SignalR client normally negotiates with the server to determine the best transport that is supported by both server and client. Kullanmak istediğiniz taşımayı zaten biliyorsanız, bu anlaşma işlemini atlayabilirsiniz.If you already know which transport you want to use, you can bypass this negotiation process. Taşıma yöntemini belirtmek için, başlangıç yöntemine bir taşıma nesnesi geçirin.To specify the transport method, pass in a transport object to the Start method. Aşağıdaki örnek, istemci kodunda taşıma yönteminin nasıl kullanılacağını gösterir.The following example shows how to specify the transport method in client code.

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.The Microsoft.AspNet.SignalR.Client.Transports namespace includes the following classes that you can use to specify the transport.

Yalnızca tarayıcılar tarafından kullanıldığından, ForeverFrame taşıması bu listeye dahil edilmez.The ForeverFrame transport is not included in this list because it is used only by browsers.

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.For information about how to check the transport method in server code, see ASP.NET SignalR Hubs API Guide - Server - How to get information about the client from the Context property. Aktarımlar ve geri göndermeler hakkında daha fazla bilgi için bkz. SignalR 'ye giriş-aktarımlar ve geri göndermeler.For more information about transports and fallbacks, see Introduction to SignalR - Transports and Fallbacks.

HTTP üst bilgilerini belirtmeHow to specify HTTP headers

HTTP üst bilgilerini ayarlamak için bağlantı nesnesindeki Headers özelliğini kullanın.To set HTTP headers, use the Headers property on the connection object. Aşağıdaki örnek, bir HTTP üst bilgisinin nasıl ekleneceğini gösterir.The following example shows how to add an HTTP header.

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ı belirtmeHow to specify client certificates

İstemci sertifikaları eklemek için bağlantı nesnesindeki AddClientCertificate yöntemini kullanın.To add client certificates, use the AddClientCertificate method on the connection object.

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şturmaHow to create the Hub proxy

İ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.In order to define methods on the client that a Hub can call from the server, and to invoke methods on a Hub at the server, create a proxy for the Hub by calling CreateHubProxy on the connection object. 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.The string you pass in to CreateHubProxy is the name of your Hub class, or the name specified by the HubName attribute if one was used on the server. Ad eşleştirme büyük küçük harfe duyarlıdır.Name matching is case-insensitive.

Sunucudaki hub sınıfıHub class on server

public class StockTickerHub : Hub

Hub sınıfı için istemci ara sunucusu oluşturmaCreate client proxy for the Hub class

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.If you decorate your Hub class with a HubName attribute, use that name.

Sunucudaki hub sınıfıHub class on server

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

Hub sınıfı için istemci ara sunucusu oluşturmaCreate client proxy for the Hub class

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.The proxy object is thread-safe. Aslında HubConnection.CreateHubProxy aynı hubNamebirden çok kez çağırırsanız, önbelleğe alınmış IHubProxy nesnesini alırsınız.In fact, if you call HubConnection.CreateHubProxy multiple times with the same hubName, you get the same cached IHubProxy object.

İstemcide sunucunun çağırabir yöntemi tanımlamaHow to define methods on the client that the server can call

Sunucunun çağırakullanabileceği bir yöntemi tanımlamak için, bir olay işleyicisini kaydetmek üzere proxy 'nin On yöntemini kullanın.To define a method that the server can call, use the proxy's On method to register an event handler.

Yöntem adı eşleştirme, büyük/küçük harfe duyarlıdır.Method name matching is case-insensitive. Örneğin, sunucusundaki Clients.All.UpdateStockPrice, istemcide updateStockPrice, updatestockpriceveya UpdateStockPrice yürütülür.For example, Clients.All.UpdateStockPrice on the server will execute updateStockPrice, updatestockprice, or UpdateStockPrice on the client.

Farklı istemci platformları, Kullanıcı arabirimini güncelleştirmek için yöntem kodu yazma konusunda farklı gereksinimlere sahiptir.Different client platforms have different requirements for how you write method code to update the UI. Gösterilen örnekler, WinRT (Windows Mağazası .NET) istemcileri içindir.The examples shown are for WinRT (Windows Store .NET) clients. WPF, Silverlight ve konsol uygulaması örnekleri, Bu konunun ilerleyen kısımlarında ayrı bir bölümdesunulmaktadır.WPF, Silverlight, and console application examples are provided in a separate section later in this topic.

Parametreleri olmayan YöntemlerMethods without parameters

İşlemekte olduğunuz yöntemin parametreleri yoksa, On yönteminin genel olmayan aşırı yüklemesini kullanın:If the method you're handling does not have parameters, use the non-generic overload of the On method:

Parametre olmadan istemci yöntemini çağıran sunucu koduServer code calling client method without parameters

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)WinRT Client code for method called from server without parameters (see WPF and Silverlight examples later in this topic)

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öntemlerMethods with parameters, specifying the parameter types

İşlemekte olduğunuz yöntemin parametreleri varsa, On yönteminin genel türleri olarak parametre türlerini belirtin.If the method you're handling has parameters, specify the types of the parameters as the generic types of the On method. 8 ' e kadar parametre belirtmenizi sağlayan On yönteminin genel aşırı yüklemeleri vardır (Windows Phone 7 üzerinde 4).There are generic overloads of the On method to enable you to specify up to 8 parameters (4 on Windows Phone 7). Aşağıdaki örnekte, UpdateStockPrice yöntemine bir parametre gönderilir.In the following example, one parameter is sent to the UpdateStockPrice method.

İstemci yöntemini bir parametre ile çağıran sunucu koduServer code calling client method with a parameter

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

Parametresi için kullanılan hisse senedi sınıfıThe Stock class used for the parameter

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)WinRT Client code for a method called from server with a parameter (see WPF and Silverlight examples later in this topic)

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öntemlerMethods with parameters, specifying dynamic objects for the parameters

Parametreleri On yönteminin genel türleri olarak belirtmeye alternatif olarak, parametreleri dinamik nesneler olarak belirtebilirsiniz:As an alternative to specifying parameters as generic types of the On method, you can specify parameters as dynamic objects:

İstemci yöntemini bir parametre ile çağıran sunucu koduServer code calling client method with a parameter

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

Parametresi için kullanılan hisse senedi sınıfıThe Stock class used for the parameter

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)WinRT Client code for a method called from server with a parameter, using a dynamic object for the parameter (see WPF and Silverlight examples later in this topic)

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ırmaHow to remove a handler

Bir işleyiciyi kaldırmak için Dispose yöntemini çağırın.To remove a handler, call its Dispose method.

Sunucudan çağrılan bir yöntem için istemci koduClient code for a method called from server

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 koduClient code to remove the handler

updateStockPriceHandler.Dispose();

İstemciden sunucu yöntemlerini çağırmaHow to call server methods from the client

Sunucuda bir yöntemi çağırmak için hub proxy üzerinde Invoke yöntemi kullanın.To call a method on the server, use the Invoke method on the Hub proxy.

Sunucu yönteminin dönüş değeri yoksa, Invoke yönteminin genel olmayan aşırı yüklemesini kullanın.If the server method has no return value, use the non-generic overload of the Invoke method.

Dönüş değeri olmayan bir yöntem için sunucu koduServer code for a method that has no return value

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 koduClient code calling a method that has no return value

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.If the server method has a return value, specify the return type as the generic type of the Invoke method.

Dönüş değerine sahip ve karmaşık bir tür parametresi alan bir yöntem için sunucu koduServer code for a method that has a return value and takes a complex type parameter

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ıThe Stock class used for the parameter and return value

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 koduClient code calling a method that has a return value and takes a complex type parameter, in an ASP.NET 4.5 async method

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 koduClient code calling a method that has a return value and takes a complex type parameter, in a synchronous method

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.The Invoke method executes asynchronously and returns a Task object. await veya .Wait()belirtmezseniz, bir sonraki kod satırı, çağırabileceğiniz yöntemin yürütmeyi bitirinceye kadar yürütülür.If you don't specify await or .Wait(), the next line of code will execute before the method that you invoke has finished executing.

Bağlantı ömrü olaylarını işlemeHow to handle connection lifetime events

SignalR, işleyebilmeniz için aşağıdaki bağlantı ömrü olaylarını sağlar:SignalR provides the following connection lifetime events that you can handle:

  • Received: bağlantıda herhangi bir veri alındığında tetiklenir.Received: Raised when any data is received on the connection. Alınan verileri sağlar.Provides the received data.
  • ConnectionSlow: istemci yavaş veya sık bir bırakma bağlantısı algıladığında tetiklenir.ConnectionSlow: Raised when the client detects a slow or frequently dropping connection.
  • Reconnecting: temeldeki aktarım yeniden bağlanmaya başladığında tetiklenir.Reconnecting: Raised when the underlying transport begins reconnecting.
  • Reconnected: temeldeki aktarım yeniden bağlandığında tetiklenir.Reconnected: Raised when the underlying transport has reconnected.
  • StateChanged: bağlantı durumu değiştiğinde tetiklenir.StateChanged: Raised when the connection state changes. Eski durumu ve yeni durumu sağlar.Provides the old state and the new state. Bağlantı durumu değerleri hakkında daha fazla bilgi için bkz. ConnectionState numaralandırması.For information about connection state values see ConnectionState Enumeration.
  • Closed: bağlantının bağlantısı kesildiğinde tetiklenir.Closed: Raised when the connection has disconnected.

Ö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.For example, if you want to display warning messages for errors that are not fatal but cause intermittent connection problems, such as slowness or frequent dropping of the connection, handle the ConnectionSlow event.

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

Daha fazla bilgi için bkz. SignalR 'de bağlantı ömrü olaylarını anlama ve işleme.For more information, see Understanding and Handling Connection Lifetime Events in SignalR.

Hataları işlemeHow to handle errors

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.If you don't explicitly enable detailed error messages on the server, the exception object that SignalR returns after an error contains minimal information about the error. Ö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.For example, if a call to newContosoChatMessage fails, the error message in the error object contains "There was an error invoking Hub method 'contosoChatHub.newContosoChatMessage'." Sending detailed error messages to clients in production is not recommended for security reasons, but if you want to enable detailed error messages for troubleshooting purposes, use the following code on the server.

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.To handle errors that SignalR raises, you can add a handler for the Error event on the connection object.

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.To handle errors from method invocations, wrap the code in a try-catch block.

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ştirmeHow to enable client-side logging

İstemci tarafı günlük kaydını etkinleştirmek için, bağlantı nesnesindeki TraceLevel ve TraceWriter özelliklerini ayarlayın.To enable client-side logging, set the TraceLevel and TraceWriter properties on the connection object.

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 örnekleriWPF, Silverlight, and console application code samples for client methods that the server can call

Daha önce sunucunun, WinRT istemcilerine uygulama çağırabilecek istemci yöntemleri tanımlamak için gösterilen kod örnekleri.The code samples shown earlier for defining client methods that the server can call apply to WinRT clients. Aşağıdaki örnekler WPF, Silverlight ve konsol uygulama istemcileri için eşdeğer kodu gösterir.The following samples show the equivalent code for WPF, Silverlight, and console application clients.

Parametreleri olmayan YöntemlerMethods without parameters

Parametre olmadan sunucudan çağrılan yöntem için WPF istemci koduWPF client code for method called from server without parameters

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

Parametresiz sunucudan çağrılan yöntem için Silverlight istemci koduSilverlight client code for method called from server without parameters

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 koduConsole application client code for method called from server without parameters

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

Parametre türlerini belirterek parametreleri olan YöntemlerMethods with parameters, specifying the parameter types

Bir parametre ile sunucudan çağrılan bir yöntem için WPF istemci koduWPF client code for a method called from server with a parameter

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 koduSilverlight client code for a method called from server with a parameter

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 koduConsole application client code for a method called from server with a parameter

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

Parametreleri için dinamik nesneler belirten parametrelere sahip YöntemlerMethods with parameters, specifying dynamic objects for the parameters

Parametresi için dinamik bir nesne kullanarak, bir parametresiyle sunucudan çağrılan bir yöntem için WPF istemci koduWPF client code for a method called from server with a parameter, using a dynamic object for the parameter

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 koduSilverlight client code for a method called from server with a parameter, using a dynamic object for the parameter

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 koduConsole application client code for a method called from server with a parameter, using a dynamic object for the parameter

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