SignalR Sorunlarını Giderme (SignalR 1.x)

Tarafından Patrick Fletcher

Uyarı

Bu belgeler SignalR'nin en son sürümüne yönelik değildir. ASP.NET Core SignalR'ye göz atın.

Bu belgede SignalR ile ilgili yaygın sorun giderme sorunları açıklanmaktadır.

Bu belge aşağıdaki bölümleri içerir.

İstemci ve sunucu arasındaki çağrı yöntemleri sessizce başarısız oluyor

Bu bölümde, istemci ile sunucu arasındaki yöntem çağrısının anlamlı bir hata iletisi olmadan başarısız olmasına neden olabilecek durumlar açıklanmaktadır. SignalR uygulamasında, sunucunun istemcinin uyguladığı yöntemler hakkında hiçbir bilgisi yoktur; sunucu bir istemci yöntemini çağırdığında, yöntem adı ve parametre verileri istemciye gönderilir ve yöntem yalnızca sunucunun belirttiği biçimde mevcutsa yürütülür. İstemcide eşleşen bir yöntem bulunamazsa hiçbir şey olmaz ve sunucuda hata iletisi gönderilmez.

İstemci yöntemlerinin çağrılmadığını daha fazla araştırmak için, sunucudan gelen çağrıları görmek için hub'da başlangıç yöntemini çağırmadan önce günlüğü açabilirsiniz. JavaScript uygulamasında günlüğe kaydetmeyi etkinleştirmek için bkz. İstemci tarafı günlüğünü etkinleştirme (JavaScript istemci sürümü). Bir .NET istemci uygulamasında günlüğe kaydetmeyi etkinleştirmek için bkz. İstemci tarafı günlüğünü etkinleştirme (.NET İstemci sürümü).

Yanlış yazılmış yöntem, yanlış yöntem imzası veya yanlış hub adı

Çağrılan yöntemin adı veya imzası istemcide uygun bir yöntemle tam olarak eşleşmiyorsa, çağrı başarısız olur. Sunucu tarafından çağrılan yöntem adının istemcideki yöntemin adıyla eşleştiğinden emin olun. Ayrıca SignalR, JavaScript'te uygun olan camel cased yöntemlerini kullanarak hub proxy'sini oluşturur, bu nedenle sunucuda çağrılan SendMessage bir yöntem istemci proxy'sinde çağrılır sendMessage . Sunucu tarafı kodunuzda özniteliğini kullanıyorsanız HubName , kullanılan adın istemcide hub'ı oluşturmak için kullanılan adla eşleşip eşleşmediğini doğrulayın. özniteliğini HubName kullanmıyorsanız, JavaScript istemcisindeki hub'ın adının ChatHub yerine chatHub gibi camel cased olduğunu doğrulayın.

İstemcide yinelenen yöntem adı

İstemcide yalnızca büyük/küçük harfe göre farklılık gösteren yinelenen bir yönteminiz olmadığını doğrulayın. İstemci uygulamanızın adlı sendMessagebir yöntemi varsa, adlı bir yöntemin SendMessage de olmadığını doğrulayın.

İstemcide eksik JSON ayrıştırıcısı

SignalR, sunucu ve istemci arasındaki çağrıları seri hale getirmek için bir JSON ayrıştırıcısının mevcut olmasını gerektirir. İstemcinizin yerleşik JSON ayrıştırıcısı (Internet Explorer 7 gibi) yoksa, uygulamanıza bir JSON ayrıştırıcısı eklemeniz gerekir. JSON ayrıştırıcısını buradan indirebilirsiniz.

Karma Hub ve PersistentConnection söz dizimi

SignalR iki iletişim modeli kullanır: Hub'lar ve PersistentConnections. Bu iki iletişim modeli çağırmak için kullanılan söz dizimi istemci kodunda farklıdır. Sunucu kodunuzda bir hub eklediyseniz, tüm istemci kodunuzun doğru hub söz dizimini kullandığını doğrulayın.

JavaScript istemcisinde PersistentConnection oluşturan JavaScript istemci kodu

var myConnection = $.connection('/echo');

JavaScript istemcisinde Hub Proxy'si oluşturan JavaScript istemci kodu

var myHub = $.connection.MyHub;

Bir yolu PersistentConnection'a eşleyen C# sunucu kodu

RouteTable.Routes.MapConnection<MyConnection>("my", "/echo");

Bir yolu bir Hub'a veya birden çok uygulamanız varsa birden çok hub'a eşleyen C# sunucu kodu

RouteTable.Routes.MapHubs();

Abonelikler eklenmeden önce bağlantı başlatıldı

Hub'ın bağlantısı sunucudan çağrılabilen yöntemler ara sunucuya eklenmeden önce başlatılırsa, iletiler alınmaz. Aşağıdaki JavaScript kodu hub'ı düzgün başlatmaz:

Hubs iletilerinin alınmasına izin vermeyecek yanlış JavaScript istemci kodu

var chat = $.connection.chatHub;
$.connection.hub.start().done(function () {
    chat.client.broadcastMessage = function (name, message) {...};
});

Bunun yerine Başlat'ı çağırmadan önce yöntem aboneliklerini ekleyin:

Hub'a doğru abonelik ekleyen JavaScript istemci kodu

var chat = $.connection.chatHub;
chat.client.broadcastMessage = function (name, message) {...};
    $.connection.hub.start().done(function () {
        ...
    });

Hub proxy'sinde yöntem adı eksik

Sunucuda tanımlanan yöntemin istemcide abone olduğunu doğrulayın. Sunucu yöntemini tanımlasa da istemci proxy'sine eklenmelidir. Yöntemler istemci proxy'sine aşağıdaki yollarla eklenebilir (Yöntemin hub'ın doğrudan değil hub'ın üyesine client eklendiğini unutmayın):

Merkez ara sunucusuna yöntemler ekleyen JavaScript istemci kodu

// Method added to proxy in JavaScript:
myHubProxy.server.method1 = function (param1, param2) {...};
//Multiple methods added to proxy in JavaScript using jQuery:
$.extend(myHubProxy.server, {
    method1: function (param1, param2) {...},
    method2: function (param3, param4) {...}
});

Genel olarak bildirilmeyen hub veya hub yöntemleri

İstemcide görünür olması için hub uygulaması ve yöntemleri olarak publicbildirilmelidir.

Farklı bir uygulamadan hub'a erişme

SignalR Hubs'a yalnızca SignalR istemcilerini uygulayan uygulamalar aracılığıyla erişilebilir. SignalR, diğer iletişim kitaplıklarıyla (SOAP veya WCF web hizmetleri gibi) birlikte çalışamaz. Hedef platformunuz için kullanılabilir SignalR istemcisi yoksa sunucunun uç noktasına doğrudan erişemezsiniz.

Verileri el ile seri hale getirme

SignalR, yöntem parametrelerinizi seri hale getirmek için otomatik olarak JSON kullanır. Bunu kendiniz yapmanıza gerek yoktur.

OnDisconnected işlevindeki istemcide Uzak Hub yöntemi yürütülmedi

Bu davranış tasarım gereğidir. Çağrıldığında OnDisconnected , hub duruma zaten girmiştir ve başka hub yöntemlerinin Disconnected çağrılmasına izin vermez.

OnDisconnected olayında kodu doğru şekilde yürüten C# sunucu kodu

public class MyHub : Hub
{
    public override Task OnDisconnected()
    {
        // Do what you want here
        return base.OnDisconnected();
    }
}

Bağlantı sınırına ulaşıldı

Windows 7 gibi bir istemci işletim sisteminde IIS'nin tam sürümü kullanılırken 10 bağlantı sınırı uygulanır. İstemci işletim sistemi kullanırken, bu sınırdan kaçınmak için bunun yerine IIS Express kullanın.

Etki alanları arası bağlantı düzgün ayarlanmadı

Etki alanları arası bağlantı (SignalR URL'sinin barındırma sayfasıyla aynı etki alanında olmadığı bir bağlantı) doğru ayarlanmadıysa, bağlantı hata iletisi olmadan başarısız olabilir. Etki alanları arası iletişimi etkinleştirme hakkında bilgi için bkz. Etki alanları arası bağlantı kurma.

NTLM (Active Directory) kullanan bağlantı .NET istemcisinde çalışmıyor

Bağlantı düzgün yapılandırılmamışsa Etki Alanı güvenliği kullanan bir .NET istemci uygulamasında bağlantı başarısız olabilir. SignalR'yi etki alanı ortamında kullanmak için gerekli bağlantı özelliğini aşağıdaki gibi ayarlayın:

Bağlantı kimlik bilgilerini uygulayan C# istemci kodu

connection.Credentials = CredentialCache.DefaultCredentials;

Diğer bağlantı sorunları

Bu bölümde, bağlantı sırasında oluşan belirli belirtilerin veya hata iletilerinin nedenleri ve çözümleri açıklanmaktadır.

"Verilerin gönderilebilmesi için başlangıç çağrılmalıdır" hatası

Bu hata genellikle bağlantı başlatılmadan önce kod SignalR nesnelerine başvuruda bulunursa görülür. İşleyiciler ve sunucuda tanımlanan çağrı yöntemlerini çağıracak benzerleri için kablo bağlantısı, bağlantı tamamlandıktan sonra eklenmelidir. çağrısının Start zaman uyumsuz olduğunu unutmayın, bu nedenle çağrının ardından gelen kod tamamlanmadan önce yürütülebilir. Bağlantı tamamen başlatıldıktan sonra işleyici eklemenin en iyi yolu, bunları başlangıç yöntemine parametre olarak geçirilen bir geri çağırma işlevine yerleştirmektir:

SignalR nesnelerine başvuran olay işleyicilerini doğru şekilde ekleyen JavaScript istemci kodu

$.connection.hub.start().done(function () {
    // Wire up Send button to call NewContosoChatMessage on the server.
    $('#newContosoChatMessage').click(function () {
        contosoChatHubProxy.server.newContosoChatMessage(
            $('#displayname').val(), $('#message').val());
            $('#message').val('').focus();
    });

SignalR nesnelerine başvurulmaya devam edilirken bağlantı durduğunda da bu hata görülür.

"301 Kalıcı Olarak Taşındı" veya "302 Geçici Olarak Taşındı" hatası

Proje SignalR adlı bir klasör içeriyorsa bu hata görülebilir ve bu klasör otomatik olarak oluşturulan proxy'yi engeller. Bu hatayı önlemek için, uygulamanızda adlı SignalR bir klasörü kullanmayın veya otomatik ara sunucu oluşturmayı kapatmayın. Daha fazla ayrıntı için bkz. Oluşturulan Ara Sunucu ve sizin için yaptıkları .

.NET veya Silverlight istemcisinde "403 Yasak" hatası

Bu hata, etki alanları arası iletişimin düzgün etkinleştirilmediği etki alanları arası ortamlarda oluşabilir. Etki alanları arası iletişimi etkinleştirme hakkında bilgi için bkz. Etki alanları arası bağlantı kurma. Silverlight istemcisinde etki alanları arası bağlantı kurmak için bkz. Silverlight istemcilerinden etki alanları arası bağlantılar.

"404 Bulunamadı" hatası

Bu sorunun çeşitli nedenleri vardır. Aşağıdakilerin tümünü doğrulayın:

  • Hub proxy adresi başvurusu doğru biçimlendirilmedi: Bu hata genellikle oluşturulan hub ara sunucu adresine başvurunun doğru biçimlendirilmemesi durumunda görülür. Hub adresine başvurunun düzgün yapıldığını doğrulayın. Ayrıntılar için bkz. Dinamik olarak oluşturulan ara sunucuya başvurma .
  • Hub yolunu eklemeden önce uygulamaya yol ekleme: Uygulamanız başka yollar kullanıyorsa, eklenen ilk yolun çağrısı MapHubsolduğunu doğrulayın.

"500 İç Sunucu Hatası"

Bu, çok çeşitli nedenleri olabilecek çok genel bir hatadır. Hatanın ayrıntıları sunucunun olay günlüğünde görünmelidir veya sunucuda hata ayıklama yoluyla bulunabilir. Sunucuda ayrıntılı hatalar açılarak daha ayrıntılı hata bilgileri elde edilebilir. Daha fazla bilgi için bkz. Hub sınıfındaki hataları işleme.

"TypeError: <hubType> tanımlanmamış" hatası

çağrısı MapHubs düzgün yapılmazsa bu hata oluşur. Daha fazla bilgi için bkz . SignalR yolunu kaydetme ve SignalR seçeneklerini yapılandırma .

JsonSerializationException kullanıcı kodu tarafından işlenmemiş

Yöntemlerinize gönderdiğiniz parametrelerin seri hale getirilemeyen türler (dosya tanıtıcıları veya veritabanı bağlantıları gibi) içermediğini doğrulayın. İstemciye gönderilmesini istemediğiniz bir sunucu tarafı nesnesinde üyeleri kullanmanız gerekiyorsa (güvenlik veya serileştirme nedeniyle) özniteliğini JSONIgnore kullanın.

"Protokol hatası: Bilinmeyen aktarım" hatası

İstemci SignalR'nin kullandığı aktarımları desteklemiyorsa bu hata oluşabilir. SignalR ile hangi tarayıcıların kullanılabileceğini öğrenmek için bkz . Aktarımlar ve Geri Dönüşler .

"JavaScript Hub proxy oluşturma devre dışı bırakıldı."

Bu hata, konumunda dinamik olarak oluşturulan ara signalr/hubssunucuya başvuru da dahil edilirken ayarlanırsa DisableJavaScriptProxies oluşur. Proxy'yi el ile oluşturma hakkında daha fazla bilgi için bkz. Oluşturulan ara sunucu ve sizin için yaptıkları.

"Bağlantı kimliği yanlış biçimde" veya "Etkin SignalR bağlantısı sırasında kullanıcı kimliği değiştirilemez" hatası

Kimlik doğrulaması kullanılıyorsa ve bağlantı durdurulmadan önce istemci oturumu kapatılırsa bu hata görülebilir. Çözüm, istemcinin oturumunu kapatmadan önce SignalR bağlantısını durdurmaktır.

"Yakalanmayan Hata: SignalR: jQuery bulunamadı. SignalR.js dosyasından önce jQuery'ye başvuruldığından emin olun" hatası

SignalR JavaScript istemcisinin çalışması için jQuery gerekir. jQuery başvurunuzun doğru olduğunu, kullanılan yolun geçerli olduğunu ve jQuery başvurusunun SignalR başvurusundan önce olduğunu doğrulayın.

"Uncaught TypeError: Undefined'in '<property>' özelliği okunamıyor" hatası

Bu hata, jQuery veya hubs proxy'sine düzgün başvurulmamasından kaynaklanır. jQuery ve hubs proxy'sine başvurunuzun doğru olduğunu, kullanılan yolun geçerli olduğunu ve jQuery başvurusunun hubs proxy'sine başvurudan önce olduğunu doğrulayın. Hubs proxy'sine yönelik varsayılan başvuru aşağıdaki gibi görünmelidir:

Hubs proxy'sine doğru başvuruda bulunan HTML istemci tarafı kodu

<script src="/signalr/hubs"></script>

"RuntimeBinderException kullanıcı kodu tarafından işlenmemiş" hatası

Yanlış aşırı yükleme Hub.On kullanıldığında bu hata oluşabilir. Yöntemin dönüş değeri varsa, dönüş türü genel tür parametresi olarak belirtilmelidir:

İstemcide tanımlanan yöntem (oluşturulan ara sunucu olmadan)

MyHub.On<ReturnType>("MethodName", LocalMethod);

Bağlantı kimliği tutarsız veya sayfa yüklemeleri arasındaki bağlantı sonları

Bu davranış tasarım gereğidir. Hub nesnesi sayfa nesnesinde barındırıldığından, sayfa yenilendiğinde hub yok edilir. Çok sayfalı bir uygulamanın, sayfa yüklemeleri arasında tutarlı olması için kullanıcılar ve bağlantı kimlikleri arasındaki ilişkiyi koruması gerekir. Bağlantı kimlikleri sunucuda bir ConcurrentDictionary nesnede veya veritabanında depolanabilir.

"Değer null olamaz" hatası

İsteğe bağlı parametrelere sahip sunucu tarafı yöntemleri şu anda desteklenmemektedir; İsteğe bağlı parametre atlanırsa yöntem başarısız olur. Daha fazla bilgi için bkz . İsteğe Bağlı Parametreler.

Firebug'da "Firefox adresteki <>sunucuyla bağlantı kuramıyor" hatası

Bu hata iletisi, WebSocket aktarım anlaşması başarısız olursa ve bunun yerine başka bir aktarım kullanılırsa Firebug'da görülebilir. Bu davranış tasarım gereğidir.

.NET istemci uygulamasında "Uzak sertifika doğrulama yordamına göre geçersiz" hatası

Sunucunuz özel istemci sertifikaları gerektiriyorsa, istek yapılmadan önce bağlantıya bir x509certificate ekleyebilirsiniz. kullanarak Connection.AddClientCertificatesertifikayı bağlantıya ekleyin.

Kimlik doğrulaması zaman aşımına uğradıktan sonra bağlantı düşüyor

Bu davranış tasarım gereğidir. Bağlantı etkinken kimlik doğrulaması kimlik bilgileri değiştirilemez; kimlik bilgilerini yenilemek için bağlantı durdurulmalı ve yeniden başlatılmalıdır.

jQuery Mobile kullanılırken OnConnected iki kez çağrılır

jQuery Mobile'ın initializePage işlevi, her sayfadaki betikleri yeniden yürütülmeye zorlar ve böylece ikinci bir bağlantı oluşturur. Bu sorunun çözümleri şunlardır:

  • JavaScript dosyanızdan önce jQuery Mobile'a başvuruyu ekleyin.
  • initializePage ayarını $.mobile.autoInitializePage = falseyaparak işlevi devre dışı bırakın.
  • Bağlantıyı başlatmadan önce sayfanın başlatılmasının tamamlanmasını bekleyin.

Sunucu Tarafından Gönderilen Olaylar kullanılarak Silverlight uygulamalarında iletiler geciktiriliyor

Silverlight'ta sunucu tarafından gönderilen olaylar kullanılırken iletiler geciktirilir. Bunun yerine uzun yoklamayı kullanmaya zorlamak için bağlantıyı başlatırken aşağıdakileri kullanın:

connection.Start(new LongPollingTransport());

Forever Frame protokolü kullanılarak "İzin Reddedildi"

Bu bilinen bir sorundur ve burada açıklanmıştır. Bu belirti en son JQuery kitaplığı kullanılarak görülebilir; Geçici çözüm, uygulamanızı JQuery 1.8.2'ye düşürmektir.

Derleme ve sunucu tarafı hataları

Aşağıdaki bölümde, derleyici ve sunucu tarafı çalışma zamanı hatalarına yönelik olası çözümler yer almaktadır.

Hub örneğine başvuru null

Her bağlantı için bir hub örneği oluşturulduğundan, kodunuzda hub örneği oluşturamazsınız. Hub'da yöntemleri hub'ın dışından çağırmak için bkz. Hub bağlamına başvuru elde etmek için bkz. hub sınıfının dışından istemci yöntemlerini çağırma ve grupları yönetme .

HTTPContext.Current.Session null

Bu davranış tasarım gereğidir. Oturum durumunun etkinleştirilmesi çift yönlü mesajlaşmayı bozabileceğinden SignalR ASP.NET oturum durumunu desteklemez.

Geçersiz kılınacak uygun yöntem yok

Eski belgelerden veya bloglardan kod kullanıyorsanız bu hatayı görebilirsiniz. Değiştirilmiş veya kullanım dışı bırakılmış yöntemlerin adlarına başvurmadığınızdan emin olun (örneğin OnConnectedAsync).

HostContextExtensions.WebSocketServerUrl null

Bu davranış tasarım gereğidir. Bu üye kullanım dışıdır ve kullanılmamalıdır.

"'signalr.hubs' adlı bir yol zaten yol koleksiyonunda" hatası

Uygulamanız tarafından iki kez çağrılırsa MapHubs bu hata görüntülenir. Bazı örnek uygulamalar doğrudan genel uygulama dosyasında çağrı MapHubs yapar; diğerleri çağrıyı sarmalayıcı sınıfında yapar. Uygulamanızın ikisini birden yapmadığından emin olun.

Visual Studio sorunları

Bu bölümde Visual Studio'da karşılaşılan sorunlar açıklanmaktadır.

Betik Belgeleri düğümü Çözüm Gezgini

Bazı öğreticilerimiz, hata ayıklama sırasında sizi Çözüm Gezgini'daki "Betik Belgeleri" düğümüne yönlendirir. Bu düğüm JavaScript hata ayıklayıcısı tarafından oluşturulur ve yalnızca Internet Explorer'da tarayıcı istemcilerinde hata ayıklanırken görünür; Chrome veya Firefox kullanılırsa düğüm görünmez. Silverlight hata ayıklayıcısı gibi başka bir istemci hata ayıklayıcısı çalışıyorsa JavaScript hata ayıklayıcısı da çalışmaz.

SignalR, Visual Studio 2008 veya önceki sürümlerde çalışmıyor

Bu davranış tasarım gereğidir. SignalR için .NET Framework 4 veya üzeri gerekir; bu, SignalR uygulamalarının Visual Studio 2010 veya sonraki sürümlerde geliştirilmesini gerektirir.

IIS sorunları

Bu bölüm, Internet Information Services ile ilgili sorunlar içerir.

MapHubs çağrısının ardından web sitesi kilitleniyor

Bu sorun SignalR'nin en son sürümünde düzeltilmiştir. Yüklemenizi NuGet kullanarak güncelleştirerek SignalR'nin en son yayımlanan sürümünü kullandığınızı doğrulayın.

Azure sorunları

Bu bölüm, Microsoft Azure ile ilgili sorunları içerir.

Konu adları değiştirildikten sonra iletiler Azure arka düzlemi üzerinden alınmaz

Azure arka düzlemi tarafından kullanılan konuların kullanıcı tarafından yapılandırılabilir olması amaçlanmamıştır.