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
- Diğer bağlantı sorunları
- Derleme ve sunucu tarafı hataları
- Visual Studio sorunları
- Internet Information Services sorunları
- Azure sorunları
İ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ı sendMessage
bir 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 public
bildirilmelidir.
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ı
MapHubs
olduğ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/hubs
sunucuya 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.AddClientCertificate
sertifikayı 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 = false
yaparak 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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin