Persyaratan: Sebagian besar situs web sekarang terutama menggunakan protokol versi Http/1.1 dan Http/2.0, untuk situs web yang hanya mendukung versi protokol HTTP/2, menggunakan HttpClient untuk mengirim permintaan secara default, akan melemparkan System.Net.Http.Http.Http.HttpRequestException: Terjadi kesalahan saat mengirim permintaan. ---> System.IO.IOException: Tidak dapat membaca data dari koneksi transportasi: Perangkat lunak di host Anda telah membatalkan koneksi yang dibuat. ---> System.Net.Sockets.SocketException (10053): Perangkat lunak di host Anda membatalkan koneksi yang dibuat. di System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.CreateException(kesalahan SocketError, Boolean forAsyncThrow).
Sejarah protokol HTTP
Garis waktu
HTTP/0.9
HTTP / 0.9 yang usang adalah versi pertama dari protokol HTTP, lahir pada tahun 1989. Ini sangat sederhana, memungkinkan klien untuk mengirim permintaan GET dan tidak mendukung header permintaan. Karena tidak ada header protokol, HTTP/0.9 hanya dapat mendukung satu jenis konten - teks biasa. Server hanya dapat merespons string dalam format HTML, bukan format lain. Ketika server selesai mengirim, koneksi TCP ditutup. HTTP/0.9 memiliki kewarganegaraan yang khas, di mana setiap kunjungan diproses secara independen dan terputus saat pemrosesan selesai. Jika halaman yang diminta tidak ada, tidak ada kode kesalahan yang ditampilkan.
HTTP/1
HTTP/1 adalah istilah kolektif untuk HTTP 1.0 dan HTTP 1.1, yang mengacu pada versi protokol HTTP yang masing-masing 1.0 dan 1.1. HTTP 1.0 adalah versi kedua dari protokol HTTP dan masih diadopsi secara luas hingga saat ini. Ini telah membuat sejumlah peningkatan dan peningkatan berdasarkan HTTP/0.9, termasuk:
Lebih banyak format seperti gambar, video, biner dapat dikirim lebih dari sekadar teks Selain metode permintaan POST dan POST telah ditambahkan Mengubah format permintaan dan respons HTTP. Selain bagian data, setiap komunikasi harus menyertakan header HTTP yang menjelaskan beberapa metadata, yaitu, informasi header permintaan ditambahkan Menambahkan fungsi seperti kode status respons, dukungan multi-set karakter, otorisasi, cache, dan pengkodean konten Meskipun masih merupakan protokol stateless, koneksi panjang dapat didukung dengan menambahkan header "Connection: keep-alive" ke permintaan
HTTP 1.1
HTTP 1.1 adalah protokol standar, dan HTTP 1.1 menghilangkan banyak ambiguitas dan memperkenalkan beberapa peningkatan.
Keganjilan
Pemrosesan cache, HTTP 1.1 memperkenalkan lebih banyak kebijakan kontrol cache, seperti tag Entitas, If-Unmodified-Since, If-Match, If-None-Match, dll., dan lebih banyak header cache opsional untuk mengontrol kebijakan cache. Pengoptimalan bandwidth dan penggunaan koneksi jaringan memperkenalkan rentang di header permintaan, yang memungkinkan hanya satu bagian dari sumber daya yang diminta, yaitu mengembalikan kode status 206, yang memudahkan pengembang untuk secara bebas memilih untuk memanfaatkan bandwidth dan tautan sepenuhnya, dan dapat menggunakan Range dan Content-Range untuk membuat fungsi dilanjutkan titik henti. Manajemen pemberitahuan kesalahan, 24 kode status kesalahan baru telah ditambahkan di HTTP 1.1. Menambahkan header Host memungkinkan nama domain yang berbeda dikonfigurasi di server dengan alamat IP yang sama. Mendukung koneksi panjang, HTTP 1.1 mendukung koneksi panjang, beberapa permintaan dan respons HTTP dapat ditransmisikan pada koneksi TCP, mengurangi konsumsi dan penundaan membuat dan menutup koneksi, dan Connection:keep-alive diaktifkan secara default di HTTP 1.1, dan browser umum memungkinkan 6 tautan panjang dibuat secara bersamaan untuk nama domain yang sama. Menambahkan teknologi pipelining untuk memungkinkan permintaan kedua dikirim sebelum respons pertama dikirim sepenuhnya untuk meningkatkan pemblokiran antrean, tetapi urutan respons akan tetap dikembalikan dalam urutan permintaan. Mendukung pemotongan respons, dengan mengatur Transfer-Encoding: dipotong untuk respons terpotong, memungkinkan data respons dibagi menjadi beberapa bagian, dan server dapat melepaskan buffer sesegera mungkin untuk mendapatkan kecepatan respons yang lebih cepat.
HTTP 2.0
HTTP 2.0 memiliki kinerja yang lebih baik, dan sekarang halaman web menjadi semakin kompleks, dan bahkan berkembang menjadi aplikasi yang unik, jumlah pemutaran media, ukuran skrip untuk meningkatkan interaksi juga meningkat pesat, dan lebih banyak data yang ditransmisikan melalui permintaan HTTP, sehingga HTTP 2.0 telah membuat banyak pengoptimalan untuk efisiensi jaringan.
Keganjilan
Pemisahan Bingkai Biner, HTTP 2.0 adalah protokol biner daripada protokol teks yang membagi semua informasi yang dikirimkan menjadi pesan dan bingkai yang lebih kecil dan mengkodekannya dalam format biner. Multiplexing, permintaan paralel dapat diproses dalam tautan yang sama, semua akses dengan nama domain yang sama berasal dari koneksi TCP yang sama, pesan HTTP dipecah menjadi bingkai independen, dan server menyusun kembali pesan sesuai dengan pengidentifikasi dan header, menghapus batasan urutan dan pemblokiran di HTTP 1.1. Mengompresi header, yang seringkali serupa dalam serangkaian permintaan, menghilangkan biaya duplikasi dan transmisi data duplikat. Push sisi server, server dapat secara proaktif mendorong sumber daya ke klien tanpa permintaan eksplisit dari klien.
HTTP 3.0
HTTP 3.0 saat ini sedang dalam tahap perumusan dan pengujian, merupakan protokol HTTP baru di masa depan, protokol HTTP 3.0 berjalan di atas protokol QUIC, didasarkan pada UDP untuk mencapai transmisi yang andal, kecepatan transmisi trade-off dan keandalan transmisi dan mengoptimalkan, menggunakan UDP akan menghindari masalah pemblokiran antrean TCP, dan mempercepat kecepatan transmisi jaringan, tetapi juga perlu mencapai mekanisme transmisi yang andal, HTTP 3.0 bukan perpanjangan dari HTTP 2.0, HTTP 3.0 akan menjadi protokol yang sama sekali baru.
HttpClientHandler VS SocketsHttpHandler
Penanganan pesan default yang digunakan oleh HttpClient di .NET Framework dan .NET Core 2.0 dan yang lebih lama adalah HttpClientHandler.
Dimulai dengan .NET Core 2.1, kelasSocketsHttpHandler menyediakan kelas jaringan HTTP tingkat yang lebih tinggi(misalnya HttpClient). Menggunakan SocketsHttpHandler menawarkan banyak keuntungan:
Performa telah meningkat secara signifikan dibandingkan dengan implementasi sebelumnya. Hilangkan dependensi platform untuk menyederhanakan penerapan dan layanan. Misalnya, libcurl tidak lagi bergantung pada .NET Core untuk macOS dan .NET Core untuk Linux. Perilaku yang konsisten di semua platform .NET.
Di .NET 9, HttpClientFactory menggunakan SocketsHttpHandler sebagai handler utama
HttpClientFactory memungkinkan konfigurasi alur HttpClient untuk objek HttpMessageHandler bernama dan diketik. Handler terdalam atau handler yang benar-benar mengirim permintaan di jaringan disebut master handler. Jika tidak dikonfigurasi, handler ini selalu menjadi HttpClientHandler sebelumnya. Meskipun penangan master default adalah detail implementasi, ada pengguna yang mengandalkannya. Misalnya, beberapa pengguna mentransmisikan handler utama ke properti pengaturan HttpClientHandler seperti ClientCertificates, UseCookies, dan UseProxy.
Tautan:Login hyperlink terlihat.
Konfigurasi global meminta versi protokol HTTP
Kodenya adalah sebagai berikut:
Versi DefaultRequestVersionPengaturan defaultnya adalah HttpVersion.Version11。
Properti DefaultRequestVersion menentukan versi HTTP default yang akan digunakan untuk permintaan yang dikirim menggunakan instans HttpClient ini, saat membangun HttpRequestMessage untuk dikirim, khususnya dengan memanggil 、、、GetStreamAsyncGetAsyncGetAsyncGetAsyncGetByteArrayAsync, PatchAsyncGetStringAsync, PostAsync dan PutAsync.
DefaultRequestVersion propertiTidak berlaku untuk metode SendAsync。 Parameter HttpRequestMessage yang diteruskan ke metode SendAsync sebagai parameter memiliki properti Version-nya sendiri yang mengontrol versi HTTP yang digunakan untuk permintaan.
Tautan:Login hyperlink terlihat.
Kebijakan negosiasi HttpVersionPolicy
PermintaanVersiAtau Lebih Rendah: Gunakan versi yang diminta, atau downgrade ke versi yang lebih rendah (tetapi tidak lebih tinggi dari versi yang diminta). Ini adalah perilaku default. Secara sederhana, versi protokol yang paling banyak digunakan adalah versi saat ini, dan jika versi protokol saat ini tidak didukung, itu akan diturunkan.
PermintaanVersiAtau Lebih Tinggi: Gunakan versi tertinggi yang didukung oleh server, tetapi tidak lebih rendah dari versi yang diminta. Artinya, peningkatan diizinkan, dan penurunan versi di bawah versi yang diminta tidak diizinkan. Secara sederhana, gunakan protokol versi yang lebih tinggi untuk komunikasi jika memungkinkan.
PermintaanVersiTepat: Gunakan versi yang diminta secara ketat, tidak ada peningkatan atau penurunan yang diizinkan.
HttpClient menggunakan protokol versi Http/2.0
Kode pengujiannya adalah sebagai berikut:
Permintaan menggunakan versi 1.1, dan klien dan server akhir bernegosiasi untuk menggunakan protokol 2.0 untuk berkomunikasi, sehingga respons akhir adalah versi 2.0, seperti yang ditunjukkan pada gambar di bawah ini:
Referensi:
Login hyperlink terlihat.
Login hyperlink terlihat.
Login hyperlink terlihat. |