Bagikan melalui


Pemecahan Masalah SignalR (SignalR 1.x)

oleh Patrick Fletcher

Peringatan

Dokumentasi ini bukan untuk versi terbaru SignalR. Lihat ASP.NET Core SignalR.

Dokumen ini menjelaskan masalah pemecahan masalah umum dengan SignalR.

Dokumen ini berisi bagian berikut.

Metode panggilan antara klien dan server secara diam-diam gagal

Bagian ini menjelaskan kemungkinan penyebab panggilan metode antara klien dan server gagal tanpa pesan kesalahan yang bermakna. Dalam aplikasi SignalR, server tidak memiliki informasi tentang metode yang diterapkan klien; ketika server memanggil metode klien, nama metode dan data parameter dikirim ke klien, dan metode dijalankan hanya jika ada dalam format yang ditentukan server. Jika tidak ada metode pencocokan yang ditemukan pada klien, tidak ada yang terjadi, dan tidak ada pesan kesalahan yang dimunculkan di server.

Untuk menyelidiki lebih lanjut metode klien yang tidak dipanggil, Anda dapat mengaktifkan pengelogan sebelum memanggil metode mulai di hub untuk melihat panggilan apa yang berasal dari server. Untuk mengaktifkan pengelogan di aplikasi JavaScript, lihat Cara mengaktifkan pengelogan sisi klien (versi klien JavaScript). Untuk mengaktifkan pengelogan di aplikasi klien .NET, lihat Cara mengaktifkan pengelogan sisi klien (versi Klien.NET).

Metode yang salah eja, tanda tangan metode yang salah, atau nama hub yang salah

Jika nama atau tanda tangan metode yang dipanggil tidak sama persis dengan metode yang sesuai pada klien, panggilan akan gagal. Verifikasi bahwa nama metode yang dipanggil oleh server cocok dengan nama metode pada klien. Selain itu, SignalR membuat proksi hub menggunakan metode camel-cased, seperti yang sesuai dalam JavaScript, sehingga metode yang dipanggil SendMessage di server akan dipanggil sendMessage di proksi klien. Jika Anda menggunakan HubName atribut dalam kode sisi server Anda, verifikasi bahwa nama yang digunakan cocok dengan nama yang digunakan untuk membuat hub pada klien. Jika Anda tidak menggunakan HubName atribut , verifikasi bahwa nama hub di klien JavaScript adalah camel-cased, seperti chatHub, bukan ChatHub.

Nama metode duplikat pada klien

Verifikasi bahwa Anda tidak memiliki metode duplikat pada klien yang hanya berbeda menurut kasus. Jika aplikasi klien Anda memiliki metode yang disebut sendMessage, verifikasi bahwa tidak ada juga metode yang disebut SendMessage .

Pengurai JSON yang hilang pada klien

SignalR mengharuskan parser JSON hadir untuk menserialisasikan panggilan antara server dan klien. Jika klien Anda tidak memiliki pengurai JSON bawaan (seperti Internet Explorer 7), Anda harus menyertakannya dalam aplikasi Anda. Anda dapat mengunduh parser JSON di sini.

Sintaks Mixing Hub dan PersistentConnection

SignalR menggunakan dua model komunikasi: Hub dan PersistentConnections. Sintaks untuk memanggil kedua model komunikasi ini berbeda dalam kode klien. Jika Anda telah menambahkan hub dalam kode server Anda, verifikasi bahwa semua kode klien Anda menggunakan sintaks hub yang tepat.

Kode klien JavaScript yang membuat PersistentConnection di klien JavaScript

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

Kode klien JavaScript yang membuat Proksi Hub di klien Javascript

var myHub = $.connection.MyHub;

Kode server C# yang memetakan rute ke PersistentConnection

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

Kode server C# yang memetakan rute ke Hub, atau ke beberapa hub jika Anda memiliki beberapa aplikasi

RouteTable.Routes.MapHubs();

Koneksi dimulai sebelum langganan ditambahkan

Jika koneksi Hub dimulai sebelum metode yang dapat dipanggil dari server ditambahkan ke proksi, pesan tidak akan diterima. Kode JavaScript berikut tidak akan memulai hub dengan benar:

Kode klien JavaScript yang salah yang tidak akan memungkinkan pesan Hub diterima

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

Sebagai gantinya, tambahkan langganan metode sebelum memanggil Mulai:

Kode klien JavaScript yang menambahkan langganan dengan benar ke hub

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

Nama metode yang hilang pada proksi hub

Verifikasi bahwa metode yang ditentukan pada server berlangganan pada klien. Meskipun server mendefinisikan metode , itu masih harus ditambahkan ke proksi klien. Metode dapat ditambahkan ke proksi klien dengan cara berikut (Perhatikan bahwa metode ditambahkan ke client anggota hub, bukan hub secara langsung):

Kode klien JavaScript yang menambahkan metode ke proksi hub

// 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) {...}
});

Metode hub atau hub tidak dinyatakan sebagai Publik

Agar terlihat pada klien, implementasi hub dan metode harus dinyatakan sebagai public.

Mengakses hub dari aplikasi yang berbeda

SignalR Hubs hanya dapat diakses melalui aplikasi yang mengimplementasikan klien SignalR. SignalR tidak dapat beroperasi dengan pustaka komunikasi lain (seperti layanan web SOAP atau WCF.) Jika tidak ada klien SignalR yang tersedia untuk platform target Anda, Anda tidak dapat mengakses titik akhir server secara langsung.

Menserialisasikan data secara manual

SignalR akan secara otomatis menggunakan JSON untuk membuat serial parameter metode Anda- tidak perlu melakukannya sendiri.

Metode Hub Jarak Jauh tidak dijalankan pada klien dalam fungsi OnDisconnected

Perilaku ini secara desain. Ketika OnDisconnected dipanggil, hub telah memasuki status Disconnected , yang tidak memungkinkan metode hub lebih lanjut dipanggil.

Kode server C# yang menjalankan kode dengan benar dalam peristiwa OnDisconnected

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

Batas koneksi tercapai

Saat menggunakan versi lengkap IIS pada sistem operasi klien seperti Windows 7, batas koneksi 10 diberlakukan. Saat menggunakan OS klien, gunakan IIS Express sebagai gantinya untuk menghindari batas ini.

Koneksi lintas domain tidak disiapkan dengan benar

Jika koneksi lintas domain (koneksi yang URL SignalR-nya tidak berada di domain yang sama dengan halaman hosting) tidak disiapkan dengan benar, koneksi mungkin gagal tanpa pesan kesalahan. Untuk informasi tentang cara mengaktifkan komunikasi lintas domain, lihat Cara membuat koneksi lintas domain.

Koneksi menggunakan NTLM (Direktori Aktif) tidak berfungsi di klien .NET

Koneksi dalam aplikasi klien .NET yang menggunakan keamanan Domain mungkin gagal jika koneksi tidak dikonfigurasi dengan benar. Untuk menggunakan SignalR di lingkungan domain, atur properti koneksi yang diperlukan sebagai berikut:

Kode klien C# yang mengimplementasikan kredensial koneksi

connection.Credentials = CredentialCache.DefaultCredentials;

Masalah koneksi lainnya

Bagian ini menjelaskan penyebab dan solusi untuk gejala atau pesan kesalahan tertentu yang terjadi selama koneksi.

Kesalahan "Mulai harus dipanggil sebelum data dapat dikirim"

Kesalahan ini biasanya terlihat jika kode mereferensikan objek SignalR sebelum koneksi dimulai. Wireup untuk handler dan seperti yang akan memanggil metode yang ditentukan pada server harus ditambahkan setelah koneksi selesai. Perhatikan bahwa panggilan ke Start tidak sinkron, sehingga kode setelah panggilan dapat dijalankan sebelum selesai. Cara terbaik untuk menambahkan handler setelah koneksi dimulai sepenuhnya adalah dengan memasukkannya ke dalam fungsi panggilan balik yang diteruskan sebagai parameter ke metode mulai:

Kode klien JavaScript yang menambahkan penanganan aktivitas dengan benar yang mereferensikan objek SignalR

$.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();
    });

Kesalahan ini juga akan terlihat jika koneksi berhenti saat objek SignalR masih dirujuk.

Kesalahan "301 Dipindahkan Secara Permanen" atau "302 Dipindahkan Sementara"

Kesalahan ini dapat dilihat jika proyek berisi folder bernama SignalR, yang akan mengganggu proksi yang dibuat secara otomatis. Untuk menghindari kesalahan ini, jangan gunakan folder yang disebut SignalR di aplikasi Anda, atau nonaktifkan pembuatan proksi otomatis. Lihat Proksi yang Dihasilkan dan apa yang dilakukannya untuk Anda untuk detail selengkapnya.

Kesalahan "403 Terlarang" di klien .NET atau Silverlight

Kesalahan ini dapat terjadi di lingkungan lintas domain di mana komunikasi lintas domain tidak diaktifkan dengan benar. Untuk informasi tentang cara mengaktifkan komunikasi lintas domain, lihat Cara membuat koneksi lintas domain. Untuk membuat koneksi lintas domain di klien Silverlight, lihat Koneksi lintas domain dari klien Silverlight.

Kesalahan "404 Tidak Ditemukan"

Ada beberapa penyebab masalah ini. Verifikasi semua hal berikut:

  • Referensi alamat proksi hub tidak diformat dengan benar: Kesalahan ini biasanya terlihat jika referensi ke alamat proksi hub yang dihasilkan tidak diformat dengan benar. Verifikasi bahwa referensi ke alamat hub dibuat dengan benar. Lihat Cara mereferensikan proksi yang dihasilkan secara dinamis untuk detailnya.
  • Menambahkan rute ke aplikasi sebelum menambahkan rute hub: Jika aplikasi Anda menggunakan rute lain, verifikasi bahwa rute pertama yang ditambahkan adalah panggilan ke MapHubs.

"Kesalahan Server Internal 500"

Ini adalah kesalahan yang sangat umum yang bisa memiliki berbagai penyebab. Detail kesalahan akan muncul di log peristiwa server, atau dapat ditemukan melalui penelusuran kesalahan server. Informasi kesalahan yang lebih rinci dapat diperoleh dengan mengaktifkan kesalahan terperinci pada server. Untuk informasi selengkapnya, lihat Cara menangani kesalahan di kelas Hub.

Kesalahan "TypeError: <hubType> tidak terdefinisi"

Kesalahan ini akan mengakibatkan jika panggilan ke MapHubs tidak dilakukan dengan benar. Lihat Cara mendaftarkan rute SignalR dan mengonfigurasi opsi SignalR untuk informasi selengkapnya.

JsonSerializationException tidak ditangani oleh kode pengguna

Verifikasi bahwa parameter yang Anda kirim ke metode Anda tidak menyertakan jenis yang tidak dapat diserialisasikan (seperti handel file atau koneksi database). Jika Anda perlu menggunakan anggota pada objek sisi server yang tidak ingin Anda kirim ke klien (baik untuk keamanan atau karena alasan serialisasi), gunakan JSONIgnore atribut .

Kesalahan "Kesalahan protokol: Transportasi tidak diketahui"

Kesalahan ini dapat terjadi jika klien tidak mendukung transportasi yang digunakan SignalR. Lihat Transportasi dan Fallback untuk informasi tentang browser mana yang dapat digunakan dengan SignalR.

"Pembuatan proksi JavaScript Hub telah dinonaktifkan."

Kesalahan ini akan terjadi jika DisableJavaScriptProxies diatur saat juga menyertakan referensi ke proksi yang dihasilkan secara dinamis di signalr/hubs. Untuk informasi selengkapnya tentang membuat proksi secara manual, lihat Proksi yang dihasilkan dan apa fungsinya untuk Anda.

Kesalahan "ID koneksi dalam format yang salah" atau "Identitas pengguna tidak dapat berubah selama koneksi SignalR aktif"

Kesalahan ini dapat dilihat jika autentikasi sedang digunakan, dan klien keluar sebelum koneksi dihentikan. Solusinya adalah menghentikan koneksi SignalR sebelum keluar dari klien.

"Kesalahan Tidak Tertangkap: SignalR: jQuery tidak ditemukan. Pastikan jQuery direferensikan sebelum file SignalR.js"

Klien SignalR JavaScript memerlukan jQuery untuk dijalankan. Verifikasi bahwa referensi Anda ke jQuery sudah benar, bahwa jalur yang digunakan valid, dan referensi ke jQuery adalah sebelum referensi ke SignalR.

Kesalahan "Uncaught TypeError: Tidak dapat membaca properti '<properti>' dari tidak terdefinis"

Kesalahan ini dihasilkan dari tidak memiliki jQuery atau proksi hub yang direferensikan dengan benar. Verifikasi bahwa referensi Anda ke jQuery dan proksi hub sudah benar, bahwa jalur yang digunakan valid, dan bahwa referensi ke jQuery adalah sebelum referensi ke proksi hub. Referensi default ke proksi hub akan terlihat seperti berikut ini:

Kode sisi klien HTML yang mereferensikan proksi Hub dengan benar

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

Kesalahan "RuntimeBinderException tidak tertangani oleh kode pengguna"

Kesalahan ini dapat terjadi ketika kelebihan beban yang Hub.On salah digunakan. Jika metode memiliki nilai pengembalian, jenis pengembalian harus ditentukan sebagai parameter jenis generik:

Metode yang ditentukan pada klien (tanpa proksi yang dihasilkan)

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

ID koneksi tidak konsisten atau pemutusan koneksi di antara pemuatan halaman

Perilaku ini secara desain. Karena objek hub dihosting di objek halaman, hub dihancurkan saat halaman di-refresh. Aplikasi multi-halaman perlu mempertahankan hubungan antara pengguna dan ID koneksi sehingga mereka akan konsisten di antara pemuatan halaman. ID koneksi dapat disimpan di server baik ConcurrentDictionary di objek atau database.

Kesalahan "Nilai tidak boleh null"

Metode sisi server dengan parameter opsional saat ini tidak didukung; jika parameter opsional dihilangkan, metode akan gagal. Untuk informasi selengkapnya, lihat Parameter Opsional.

Kesalahan "Firefox tidak dapat membuat koneksi ke server di <alamat>" di Firebug

Pesan kesalahan ini dapat dilihat di Firebug jika negosiasi transportasi WebSocket gagal dan transportasi lain digunakan sebagai gantinya. Perilaku ini secara desain.

Kesalahan "Sertifikat jarak jauh tidak valid sesuai dengan prosedur validasi" dalam aplikasi klien .NET

Jika server Anda memerlukan sertifikat klien kustom, maka Anda dapat menambahkan x509certificate ke koneksi sebelum permintaan dibuat. Tambahkan sertifikat ke koneksi menggunakan Connection.AddClientCertificate.

Koneksi turun setelah waktu autentikasi habis

Perilaku ini secara desain. Kredensial autentikasi tidak dapat dimodifikasi saat koneksi aktif; untuk menyegarkan kredensial, koneksi harus dihentikan dan dimulai ulang.

OnConnected dipanggil dua kali saat menggunakan jQuery Mobile

Fungsi jQuery Mobile initializePage memaksa skrip di setiap halaman dijalankan kembali, sehingga membuat koneksi kedua. Solusi untuk masalah ini meliputi:

  • Sertakan referensi ke jQuery Mobile sebelum file JavaScript Anda.
  • initializePage Nonaktifkan fungsi dengan mengatur $.mobile.autoInitializePage = false.
  • Tunggu hingga halaman selesai menginisialisasi sebelum memulai koneksi.

Pesan tertunda di aplikasi Silverlight menggunakan Peristiwa Terkirim Server

Pesan tertunda saat menggunakan peristiwa yang dikirim server di Silverlight. Untuk memaksa polling panjang digunakan sebagai gantinya, gunakan hal berikut saat memulai koneksi:

connection.Start(new LongPollingTransport());

"Izin Ditolak" menggunakan protokol Forever Frame

Ini adalah masalah yang diketahui, dijelaskan di sini. Gejala ini mungkin terlihat menggunakan pustaka JQuery terbaru; solusinya adalah menurunkan tingkat aplikasi Anda ke JQuery 1.8.2.

Kesalahan kompilasi dan sisi server

Bagian berikut berisi solusi yang mungkin untuk mengkompilasi dan kesalahan runtime sisi server.

Referensi ke instans Hub null

Karena instans hub dibuat untuk setiap koneksi, Anda tidak dapat membuat instans hub dalam kode Anda sendiri. Untuk memanggil metode di hub dari luar hub itu sendiri, lihat Cara memanggil metode klien dan mengelola grup dari luar kelas Hub untuk cara mendapatkan referensi ke konteks hub.

HTTPContext.Current.Session null

Perilaku ini secara desain. SignalR tidak mendukung status sesi ASP.NET, karena mengaktifkan status sesi akan merusak pesan dupleks.

Tidak ada metode yang cocok untuk diambil alih

Anda mungkin melihat kesalahan ini jika Anda menggunakan kode dari dokumentasi atau blog yang lebih lama. Verifikasi bahwa Anda tidak mereferensikan nama metode yang telah diubah atau tidak digunakan lagi (seperti OnConnectedAsync).

HostContextExtensions.WebSocketServerUrl null

Perilaku ini secara desain. Anggota ini tidak digunakan lagi dan tidak boleh digunakan.

Kesalahan "Rute bernama 'signalr.hubs' sudah ada di koleksi rute"

Kesalahan ini akan terlihat jika MapHubs dipanggil dua kali oleh aplikasi Anda. Beberapa contoh aplikasi memanggil MapHubs langsung dalam file aplikasi global; yang lain melakukan panggilan di kelas pembungkus. Pastikan aplikasi Anda tidak melakukan keduanya.

Masalah Visual Studio

Bagian ini menjelaskan masalah yang ditemui di Visual Studio.

Simpul Dokumen Skrip tidak muncul di Penjelajah Solusi

Beberapa tutorial kami mengarahkan Anda ke simpul "Dokumen Skrip" di Penjelajah Solusi saat penelusuran kesalahan. Simpul ini diproduksi oleh debugger JavaScript, dan hanya akan muncul saat menelusuri kesalahan klien browser di Internet Explorer; simpul tidak akan muncul jika Chrome atau Firefox digunakan. Debugger JavaScript juga tidak akan berjalan jika debugger klien lain berjalan, seperti debugger Silverlight.

SignalR tidak berfungsi di Visual Studio 2008 atau yang lebih lama

Perilaku ini secara desain. SignalR memerlukan .NET Framework 4 atau yang lebih baru; ini mengharuskan aplikasi SignalR dikembangkan di Visual Studio 2010 atau yang lebih baru.

Masalah IIS

Bagian ini berisi masalah dengan Layanan Informasi Internet.

Situs web crash setelah panggilan MapHubs

Masalah ini telah diperbaiki dalam versi terbaru SignalR. Verifikasi bahwa Anda menggunakan SignalR versi terbaru yang dirilis dengan memperbarui penginstalan Anda menggunakan NuGet.

Masalah Azure

Bagian ini berisi masalah dengan Microsoft Azure.

Pesan tidak diterima melalui backplane Azure setelah mengubah nama topik

Topik yang digunakan oleh backplane Azure tidak dimaksudkan untuk dapat dikonfigurasi pengguna.