SignalR’a GirişIntroduction to SignalR

, Patrick Fleti tarafındanby Patrick Fletcher

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 makalede, SignalR 'nin ne olduğu ve oluşturmakta tasarlandığı bazı çözümlerin bazıları açıklanmaktadır.This article describes what SignalR is, and some of the solutions it was designed to create.

Sorular ve açıklamalarQuestions and comments

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.Please leave feedback on how you liked this tutorial and what we could improve in the comments at the bottom of the page. Öğreticiyle doğrudan ilgili olmayan sorularınız varsa, bunları ASP.NET SignalR forumuna veya StackOverflow.com'e gönderebilirsiniz.If you have questions that are not directly related to the tutorial, you can post them to the ASP.NET SignalR forum or StackOverflow.com.

SignalR nedir?What is SignalR?

ASP.NET SignalR, uygulamalara gerçek zamanlı Web işlevselliği ekleme sürecini kolaylaştıran ASP.NET geliştiricileri için bir kitaplıktır.ASP.NET SignalR is a library for ASP.NET developers that simplifies the process of adding real-time web functionality to applications. Gerçek zamanlı Web işlevselliği, sunucu kodunun bir istemcinin yeni veri istemesine beklemesini sağlamak yerine, bağlı istemciler için sunucu kodu gönderme içeriğini anında anında gönderebilme olanağıdır.Real-time web functionality is the ability to have server code push content to connected clients instantly as it becomes available, rather than having the server wait for a client to request new data.

SignalR, ASP.NET uygulamanıza "gerçek zamanlı" bir Web işlevselliği sıralaması eklemek için kullanılabilir.SignalR can be used to add any sort of "real-time" web functionality to your ASP.NET application. Sohbet genellikle örnek olarak kullanıldığında, çok daha fazla şey yapabilirsiniz.While chat is often used as an example, you can do a whole lot more. Bir Kullanıcı yeni verileri görmek için bir Web sayfasını yenilediğinde veya sayfa yeni verileri almak için uzun yoklamayı uygularsa, SignalR kullanımı için bir adaydır.Any time a user refreshes a web page to see new data, or the page implements long polling to retrieve new data, it is a candidate for using SignalR. Panolar ve izleme uygulamaları, işbirliğine dayalı uygulamalar (belgelerin eşzamanlı düzenlemesi gibi), iş ilerleme durumu güncelleştirmeleri ve gerçek zamanlı formlar sayılabilir.Examples include dashboards and monitoring applications, collaborative applications (such as simultaneous editing of documents), job progress updates, and real-time forms.

SignalR Ayrıca sunucudan yüksek frekanslı güncelleştirmeler gerektiren, örneğin gerçek zamanlı oyun gibi Web uygulamalarının tamamen yeni türlerini de mümkün kılıyor.SignalR also enables completely new types of web applications that require high frequency updates from the server, for example, real-time gaming.

SignalR, sunucu tarafı .NET kodundan istemci tarayıcılarındaki JavaScript işlevlerini (ve diğer istemci platformları) çağıran sunucudan istemciye uzak yordam çağrıları (RPC) oluşturmaya yönelik basit bir API sağlar.SignalR provides a simple API for creating server-to-client remote procedure calls (RPC) that call JavaScript functions in client browsers (and other client platforms) from server-side .NET code. SignalR ayrıca bağlantı yönetimi için API 'YI (örneğin, bağlantı ve bağlantı kesme olayları) ve gruplandırma bağlantılarını içerir.SignalR also includes API for connection management (for instance, connect and disconnect events), and grouping connections.

SignalR ile yöntemleri çağırma

SignalR, bağlantı yönetimini otomatik olarak işler ve bir sohbet odasında olduğu gibi, iletileri bağlı tüm istemcilere yayınlamanıza olanak tanır.SignalR handles connection management automatically, and lets you broadcast messages to all connected clients simultaneously, like a chat room. İletileri belirli istemcilere de gönderebilirsiniz.You can also send messages to specific clients. Bağlantının her iletişimde tekrar kurulduğu klasik bir HTTP bağlantısının aksine, istemci ve sunucu arasındaki bağlantı kalıcıdır.The connection between the client and server is persistent, unlike a classic HTTP connection, which is re-established for each communication.

SignalR, bugün web 'de ortak olan istek-yanıt modeli yerine uzak yordam çağrılarını (RPC) kullanarak sunucu kodunun tarayıcıda istemci koduna çağırabileceği "sunucu gönderme" işlevini destekler.SignalR supports "server push" functionality, in which server code can call out to client code in the browser using Remote Procedure Calls (RPC), rather than the request-response model common on the web today.

SignalR uygulamaları yerleşik ve üçüncü taraf genişleme sağlayıcıları kullanarak binlerce istemciye ölçeklenebilir.SignalR applications can scale out to thousands of clients using built-in, and third-party scale-out providers.

Yerleşik sağlayıcılar şunları içerir:Built-in providers include:

Üçüncü taraf sağlayıcıları şunları içerir:Third-party providers include:

SignalR, GitHubüzerinden erişilebilen açık kaynaklı bir kaynaktır.SignalR is open-source, accessible through GitHub.

SignalR ve WebSocketSignalR and WebSocket

SignalR, kullanılabilir olduğunda yeni WebSocket taşımasını kullanır ve gerektiğinde eski aktarımlara geri döner.SignalR uses the new WebSocket transport where available and falls back to older transports where necessary. Uygulamanızı doğrudan WebSocket kullanarak tamamen yazabiliyorsanız, SignalR kullanarak, uygulamanız gereken çok sayıda işlevselliğin sizin için zaten yapılması gerektiği anlamına gelir.While you could certainly write your app using WebSocket directly, using SignalR means that a lot of the extra functionality you would need to implement is already done for you. En önemlisi bu, daha eski istemciler için ayrı bir kod yolu oluşturma konusunda endişelenmenize gerek kalmadan, uygulamanızı WebSocket 'ten yararlanmak üzere kodtabileceğiniz anlamına gelir.Most importantly, this means that you can code your app to take advantage of WebSocket without having to worry about creating a separate code path for older clients. SignalR Ayrıca, uygulama WebSocket sürümlerinde tutarlı bir arabirim sağlayarak, SignalR, temel aktarımda yapılan değişiklikleri destekleyecek şekilde güncelleştirildiğinden WebSocket güncelleştirmeleri konusunda endişelenmenize kalkan.SignalR also shields you from having to worry about updates to WebSocket, since SignalR is updated to support changes in the underlying transport, providing your application a consistent interface across versions of WebSocket.

Aktarımlar ve geri göndermelerTransports and fallbacks

SignalR, istemci ve sunucu arasında gerçek zamanlı çalışma yapmak için gereken aktarımlara göre soyutlamadır.SignalR is an abstraction over some of the transports that are required to do real-time work between client and server. SignalR ilk olarak mümkünse bir WebSocket bağlantısı kurmaya çalışır.SignalR first attempts to establish a WebSocket connection if possible. WebSocket, şu sahip olduğundan SignalR için en iyi aktarımdır:WebSocket is the optimal transport for SignalR because it has:

  • Sunucu belleğinin en etkili kullanımı.The most efficient use of server memory.
  • En düşük gecikme süresi.The lowest latency.
  • İstemci ve sunucu arasındaki tam çift yönlü iletişim gibi en temel özellikler.The most underlying features, such as full duplex communication between client and server.
  • En katı gereksinimler, WebSocket için sunucu gereklidir:The most stringent requirements, WebSocket requires the server:
    • Windows Server 2012 veya Windows 8 ' de çalıştırın.Run on Windows Server 2012 or Windows 8.
    • .NET Framework 4.5..NET Framework 4.5.

Bu gereksinimler karşılanmazsa, SignalR, bağlantısını yapmak için diğer aktarımları kullanmaya çalışır.If these requirements are not met, SignalR attempts to use other transports to make its connections.

HTML 5 aktarımlarıHTML 5 transports

Bu aktarımlar HTML 5desteğine bağlıdır.These transports depend on support for HTML 5. İstemci tarayıcısı HTML 5 standardını desteklemiyorsa, eski aktarımlar kullanılacaktır.If the client browser does not support the HTML 5 standard, older transports will be used.

  • WebSocket (hem sunucu hem de tarayıcı WebSocket destekleyebilecekleri anlamına gelebilir).WebSocket (if both the server and browser indicate they can support Websocket). WebSocket, istemci ve sunucu arasında doğru kalıcı, iki yönlü bir bağlantı kuran tek aktarımdır.WebSocket is the only transport that establishes a true persistent, two-way connection between client and server. Ancak, WebSocket en katı gereksinimlere da sahiptir; yalnızca Microsoft Internet Explorer, Google Chrome ve Mozilla Firefox 'un en son sürümlerinde tam olarak desteklenir ve yalnızca Opera ve Safari gibi diğer tarayıcılarda kısmi bir uygulamaya sahiptir.However, WebSocket also has the most stringent requirements; it is fully supported only in the latest versions of Microsoft Internet Explorer, Google Chrome, and Mozilla Firefox, and only has a partial implementation in other browsers such as Opera and Safari.
  • Sunucutarafından gönderilen olaylar (tarayıcı, Internet Explorer hariç tüm tarayıcılar olan sunucu tarafından gönderilen olayları destekliyorsa).Server Sent Events, also known as EventSource (if the browser supports Server Sent Events, which is basically all browsers except Internet Explorer.)

Comet taşımalarıComet transports

Aşağıdaki aktarımlar, bir tarayıcının veya başka bir istemcinin uzun süreli bir HTTP isteği tuttuğu, sunucunun istemciye özel olarak istekte bulunmaksızın veri göndermek için kullanabileceği, Comet Web uygulaması modelini temel alır.The following transports are based on the Comet web application model, in which a browser or other client maintains a long-held HTTP request, which the server can use to push data to the client without the client specifically requesting it.

  • Süresiz çerçeve (yalnızca Internet Explorer için).Forever Frame (for Internet Explorer only). Süresiz çerçeve, tamamlanmamış sunucudaki bir uç noktaya istek yapan gizli bir IFrame oluşturur.Forever Frame creates a hidden IFrame which makes a request to an endpoint on the server that does not complete. Sunucu daha sonra sürekli olarak yürütülen istemciye betiği gönderir ve sunucudan istemciye tek yönlü bir gerçek zamanlı bağlantı sağlar.The server then continually sends script to the client which is immediately executed, providing a one-way realtime connection from server to client. İstemciden sunucuya bağlantı, sunucudan istemci bağlantısına ayrı bir bağlantı kullanır ve standart bir HTTP isteği gibi, gönderilmesi gereken her veri parçası için yeni bir bağlantı oluşturulur.The connection from client to server uses a separate connection from the server to client connection, and like a standard HTTP request, a new connection is created for each piece of data that needs to be sent.
  • Ajax uzun yoklama.Ajax long polling. Uzun yoklama kalıcı bir bağlantı oluşturmaz, bunun yerine sunucu yanıt verene kadar açık kalan bir istek ile sunucuyu yoklar, bu noktada bağlantı kapatılır ve hemen yeni bir bağlantı istenir.Long polling does not create a persistent connection, but instead polls the server with a request that stays open until the server responds, at which point the connection closes, and a new connection is requested immediately. Bağlantı sıfırlarken bu bir gecikme süresine neden olabilir.This may introduce some latency while the connection resets.

Hangi yapılandırmalardan hangilerinin desteklendiği hakkında daha fazla bilgi için bkz. Desteklenen platformlar.For more information on what transports are supported under which configurations, see Supported Platforms.

Taşıma seçimi işlemiTransport selection process

Aşağıdaki listede, SignalR 'nin hangi taşımanın kullanılacağına karar vermek için kullandığı adımlar gösterilmektedir.The following list shows the steps that SignalR uses to decide which transport to use.

  1. Tarayıcı Internet Explorer 8 veya daha önceki bir sürümdeyse, uzun yoklama kullanılır.If the browser is Internet Explorer 8 or earlier, Long Polling is used.

  2. JSONP yapılandırıldıysa (diğer bir deyişle, jsonp parametresi true bağlantı başlatıldığı zaman olarak ayarlanır), uzun yoklama kullanılır.If JSONP is configured (that is, the jsonp parameter is set to true when the connection is started), Long Polling is used.

  3. Bir etki alanı bağlantısı yapılırsa (yani, SignalR uç noktası barındırma sayfasıyla aynı etki alanında değilse), aşağıdaki ölçütler karşılanıyorsa WebSocket kullanılacaktır:If a cross-domain connection is being made (that is, if the SignalR endpoint is not in the same domain as the hosting page), then WebSocket will be used if the following criteria are met:

    • İstemci CORS 'yi (çıkış noktaları arası kaynak paylaşımı) destekler.The client supports CORS (Cross-Origin Resource Sharing). CORS 'yi destekleyen istemciler hakkında daha fazla bilgi için caniuse.com adresindeki CORSbölümüne bakın.For details on which clients support CORS, see CORS at caniuse.com.

    • İstemci WebSocket 'i destekliyorThe client supports WebSocket

    • Sunucu WebSocket 'i destekliyorThe server supports WebSocket

      Bu ölçütlerden herhangi biri karşılanmazsa, uzun yoklama kullanılacaktır.If any of these criteria are not met, Long Polling will be used. Etki alanları arası bağlantılar hakkında daha fazla bilgi için bkz. etki alanları arası bağlantı oluşturma.For more information on cross-domain connections, see How to establish a cross-domain connection.

  4. JSONP yapılandırılmamışsa ve bağlantı çapraz etki alanı değilse, hem istemci hem de sunucu destekliyorsa, WebSocket kullanılır.If JSONP is not configured and the connection is not cross-domain, WebSocket will be used if both the client and server support it.

  5. İstemci veya sunucu WebSocket 'i desteklemiyorsa, varsa sunucu gönderme olayları kullanılır.If either the client or server do not support WebSocket, Server Sent Events is used if it is available.

  6. Sunucu gönderme olayları kullanılamıyorsa, süresiz kare denenir.If Server Sent Events is not available, Forever Frame is attempted.

  7. Süresiz çerçeve başarısız olursa uzun yoklama kullanılır.If Forever Frame fails, Long Polling is used.

Taşımaları izlemeMonitoring transports

Kuruluşunuzda oturum açmayı etkinleştirerek ve konsol penceresini tarayıcınızda açarak uygulamanızın hangi aktarım türünü kullandığını belirleyebilirsiniz.You can determine what transport your application is using by enabling logging on your hub, and opening the console window in your browser.

Hub 'ın bir tarayıcıdaki olayları için günlüğe kaydetmeyi etkinleştirmek üzere, istemci uygulamanıza aşağıdaki komutu ekleyin:To enable logging for your hub's events in a browser, add the following command to your client application:

$.connection.hub.logging = true;

  • Internet Explorer 'da F12 tuşuna basarak geliştirici araçlarını açın ve konsol sekmesine tıklayın.In Internet Explorer, open the developer tools by pressing F12, and click the Console tab.

    Microsoft Internet Explorer 'daki konsol

  • Chrome 'da, CTRL + SHIFT + J tuşlarına basarak konsolunu açın.In Chrome, open the console by pressing Ctrl+Shift+J.

    Google Chrome 'daki konsol

Konsol açık ve günlüğe kaydetme etkinken, SignalR tarafından hangi taşımanın kullanıldığını görebileceksiniz.With the console open and logging enabled, you'll be able to see which transport is being used by SignalR.

Internet Explorer 'da WebSocket aktarımını gösteren konsol

Taşıma belirtmeSpecifying a transport

Bir aktarım anlaşması, belirli bir süre ve istemci/sunucu kaynağı alır.Negotiating a transport takes a certain amount of time and client/server resources. İstemci özellikleri biliniyorsa, istemci bağlantısı başlatıldığında bir aktarım belirlenebilir.If the client capabilities are known, then a transport can be specified when the client connection is started. Aşağıdaki kod parçacığı, istemcinin başka bir protokolü desteklemeymediği biliniyorsa kullanılacak şekilde, Ajax uzun yoklama taşımasını kullanarak bir bağlantının başlatılmasını göstermektedir:The following code snippet demonstrates starting a connection using the Ajax Long Polling transport, as would be used if it was known that the client did not support any other protocol:

connection.start({ transport: 'longPolling' });

Bir istemcinin belirli aktarımları sırayla denemesini istiyorsanız, bir geri dönüş sırası belirtebilirsiniz.You can specify a fallback order if you want a client to try specific transports in order. Aşağıdaki kod parçacığı WebSocket denemeyi ve doğrudan uzun yoklamaya devam eden başarısız olduğunu gösterir.The following code snippet demonstrates trying WebSocket, and failing that, going directly to Long Polling.

connection.start({ transport: ['webSockets','longPolling'] });

Aktarımları belirtmeye yönelik dize sabitleri aşağıdaki gibi tanımlanır:The string constants for specifying transports are defined as follows:

  • webSockets
  • foreverFrame
  • serverSentEvents
  • longPolling

Bağlantılar ve hub 'LarConnections and Hubs

SignalR API 'SI istemciler ve sunucular arasında iletişim kurmak için iki model içerir: kalıcı bağlantılar ve hub 'Lar.The SignalR API contains two models for communicating between clients and servers: Persistent Connections and Hubs.

Bağlantı, tek alıcı, gruplandırılmış veya yayın iletileri göndermek için basit bir uç noktasını temsil eder.A Connection represents a simple endpoint for sending single-recipient, grouped, or broadcast messages. Kalıcı bağlantı API 'SI (PersistentConnection sınıfı tarafından .NET kodunda gösterilir), geliştiricilere, SignalR 'nin sunduğu alt düzey iletişim protokolüne doğrudan erişmesini sağlar.The Persistent Connection API (represented in .NET code by the PersistentConnection class) gives the developer direct access to the low-level communication protocol that SignalR exposes. Bağlantılar iletişim modelinin kullanılması, Windows Communication Foundation gibi bağlantı tabanlı API 'Leri kullanmış olan geliştiricilere tanıdık gelecektir.Using the Connections communication model will be familiar to developers who have used connection-based APIs such as Windows Communication Foundation.

Hub, istemci ve sunucunuzun birbirlerine doğrudan Yöntemler çağırmasını sağlayan bağlantı API 'SI üzerinde oluşturulmuş daha yüksek düzey bir işlem hattdır.A Hub is a more high-level pipeline built upon the Connection API that allows your client and server to call methods on each other directly. SignalR, makine sınırları arasında, MAGIC tarafından, istemcilerin sunucu üzerindeki yöntemleri kolayca yerel yöntemlerle çağırmalarına olanak sağlar ve tam tersi de geçerlidir.SignalR handles the dispatching across machine boundaries as if by magic, allowing clients to call methods on the server as easily as local methods, and vice versa. Hub iletişim modelinin kullanılması, .NET Remoting gibi uzaktan çağırma API 'Leri kullanmış olan geliştiricilere tanıdık gelecektir.Using the Hubs communication model will be familiar to developers who have used remote invocation APIs such as .NET Remoting. Hub 'ın kullanılması Ayrıca yöntemlere türü kesin belirlenmiş parametreler geçirmenize izin verir ve model bağlamayı etkinleştirir.Using a Hub also allows you to pass strongly typed parameters to methods, enabling model binding.

Mimari diyagramıArchitecture diagram

Aşağıdaki diyagramda, taşıtlar, kalıcı bağlantılar ve aktarımlar için kullanılan temel teknolojiler arasındaki ilişki gösterilmektedir.The following diagram shows the relationship between Hubs, Persistent Connections, and the underlying technologies used for transports.

API 'Leri, aktarımları ve istemcileri gösteren SignalR mimarisi diyagramı

Hub 'Lar nasıl çalışır?How Hubs work

Sunucu tarafı kod, istemcideki bir yöntemi çağırdığında, çağrılacak yöntemin adını ve parametrelerini içeren etkin aktarım genelinde bir paket gönderilir (bir nesne bir yöntem parametresi olarak gönderildiğinde JSON kullanılarak serileştirilir).When server-side code calls a method on the client, a packet is sent across the active transport that contains the name and parameters of the method to be called (when an object is sent as a method parameter, it is serialized using JSON). İstemci daha sonra yöntem adıyla istemci tarafı kodda tanımlanan yöntemlerle eşleşir.The client then matches the method name to methods defined in client-side code. Bir eşleşme varsa, istemci yöntemi serisi kaldırılan parametre verileri kullanılarak yürütülür.If there is a match, the client method will be executed using the deserialized parameter data.

Yöntem çağrısı, Fiddler gibi araçlar kullanılarak izlenebilir.The method call can be monitored using tools like Fiddler. Aşağıdaki görüntüde, bir SignalR sunucusundan, Fiddler 'ın Günlükler bölmesinde bir Web tarayıcısı istemcisine gönderilen Yöntem çağrısı gösterilmektedir.The following image shows a method call sent from a SignalR server to a web browser client in the Logs pane of Fiddler. Yöntem çağrısı adlı bir hub 'dan gönderiliyor MoveShapeHub ve çağrılan yöntem çağrılır updateShape .The method call is being sent from a hub called MoveShapeHub, and the method being invoked is called updateShape.

SignalR trafiğini gösteren Fiddler günlüğünün görünümü

Bu örnekte, hub adı H parametresiyle tanımlanır; Yöntem adı M parametresiyle tanımlanır ve yöntemine gönderilen veriler A parametresiyle tanımlanır...In this example, the hub name is identified with the H parameter; the method name is identified with the M parameter, and the data being sent to the method is identified with the A parameter. Bu iletiyi oluşturan uygulama yüksek frekanslı gerçek zamanlı öğreticide oluşturulur.The application that generated this message is created in the High-Frequency Realtime tutorial.

İletişim modeli seçmeChoosing a communication model

Çoğu uygulama, hub API 'YI kullanmalıdır.Most applications should use the Hubs API. Bağlantılar API 'SI aşağıdaki koşullarda kullanılabilir:The Connections API could be used in the following circumstances:

  • Gönderilen gerçek ileti biçiminin belirtilmesi gerekir.The format of the actual message sent needs to be specified.
  • Geliştirici bir mesajlaşma ile çalışmayı tercih eder ve bir uzaktan çağırma modeli yerine modeli gönderiyor.The developer prefers to work with a messaging and dispatching model rather than a remote invocation model.
  • Mesajlaşma modeli kullanan mevcut bir uygulama, SignalR kullanmak için alınıyor.An existing application that uses a messaging model is being ported to use SignalR.