Server melakukan pelanggaran protokol. Bagian = ERROR ResponseStatusLine

115

Saya telah membuat program, mencoba memposting string di situs dan saya mendapatkan kesalahan ini:

"Server melakukan pelanggaran protokol. Bagian = ResponseStatusLine"

setelah baris kode ini:

gResponse = (HttpWebResponse)gRequest.GetResponse(); 

Bagaimana cara memperbaiki pengecualian ini?

manish patel
sumber

Jawaban:

71

Coba letakkan ini di aplikasi / web.config Anda:

<system.net>
    <settings>
        <httpWebRequest useUnsafeHeaderParsing="true" />
    </settings>
</system.net>

Jika ini tidak berhasil, Anda juga dapat mencoba mengatur KeepAliveproperti ke false.

Darin Dimitrov
sumber
3
Saya memiliki 6 url yang melakukan kesalahan ini. Pengaturan useUnsafeHeaderParsing memperbaikinya untuk satu tautan, tetapi pengaturan KeepAlive = false memperbaikinya untuk semua 6.
David Hammond
3
Hal yang sama dapat ditempatkan di dalam tag root <configuration> di App.copnfig untuk aplikasi non-web (misalnya, saya memperbaiki aplikasi WPF seperti itu - terima kasih!).
Yury Schkatula
ada yang tahu mengapa tindakan keamanan ini diberlakukan oleh IIS? Itu berhasil, tetapi saya tidak mengerti alasan pembatasan nilai header (mengaturnya secara manual dalam kasus saya).
emran
26
Ini hanya menghindari masalah daripada benar-benar memperbaikinya. Saya pikir ini seharusnya bukan solusi default.
Tobias
4
Setuju dengan Tobias - Anda menghindari masalah. Sekarang mungkin masalahnya ada di server yang tidak dapat Anda perbaiki, dan dengan demikian penghindaran mungkin satu-satunya pilihan Anda ... tapi tetap saja, mari kita perjelas tentang perbedaan antara menghindari kesalahan protokol dan benar-benar memperbaikinya.
metaforge
58

Terkadang kesalahan ini terjadi ketika UserAgentparameter permintaan kosong (dalam api github.com dalam kasus saya).

Menyetel parameter ini ke string khusus yang tidak kosong memecahkan masalah saya.

Ivan Kochurkin
sumber
5
Ah ini yang kubutuhkan. Terima kasih. Berikut adalah contoh agen pengguna: stackoverflow.com/a/15144495/891976
David Ruhmann
Sebuah garis cepat untuk digunakan dengan WebClientdi sini stackoverflow.com/a/11841680/4795214
5
Terima kasih. Jika Anda menginginkan kueri GitHub melalui HttpClient add: client.DefaultRequestHeaders.Add("User-Agent", "Anything"); line for fix.
Cihan Yakar
32

Pelaku dalam kasus saya adalah mengembalikan No Contenttanggapan tetapi menentukan badan tanggapan pada saat yang sama. Semoga jawaban ini mengingatkan saya dan mungkin orang lain untuk tidak membalas NoContentdengan tubuh lagi.

Perilaku ini konsisten dengan 10.2.5 204 No Content dari spesifikasi HTTP yang mengatakan:

Respons 204 TIDAK HARUS menyertakan badan pesan, dan karenanya selalu diakhiri oleh baris kosong pertama setelah kolom header.

Tobias
sumber
Baca saja ini setelah saya mendapat The server committed a protocol violation. Section=ResponseStatusLine kesalahan saat menggunakan WebApi untuk mengembalikan NoContent()respons khusus yang mengirimkan No Contentrespons karena beberapa alasan aneh! Setelah saya mengeluarkannya, masalahnya hilang :)
Intrepid
2
Ini juga masalah saya, meskipun rumit karena panggilan SETELAH respons Tanpa Kontenlah yang gagal.
mdickin
Diperbaiki dengan menghapus someContentdari return Request.CreateResponse(HttpStatusCode.NoContent, someContent); +1
snippetkid
12

Kemungkinan lain: saat melakukan POST, server merespons dengan 100 melanjutkan dengan cara yang salah.

Ini memecahkan masalah saya:

request.ServicePoint.Expect100Continue = false;
marq
sumber
Ini bekerja untuk saya saat mengakses MediaFire API.
AlexPi
3
Saya tahu saya akan datang terlambat tapi, apa yang Anda maksud dengan "dengan cara yang salah"?
kuskmen
1
Untuk siapa saja yang menggunakan HttpClient , berikut ini yang berhasil untuk saya:var http = new HttpClient(); http.DefaultRequestHeaders.ExpectContinue = false;
user2444499
9

Ini terjadi pada saya ketika Skype berjalan di mesin lokal saya. Begitu saya menutupnya, pengecualian itu hilang.

Ide milik halaman ini

Luke
sumber
Punya masalah yang sama. Ternyata Skype. Sangat disayangkan bahwa pesan yang tepat tidak dapat diberikan.
jordan koskei
Anda sebenarnya tidak perlu menutup Skype, saya menambahkan jawaban di bawah ini untuk menunjukkan cara mengatasinya tanpa menutup Skype.
AltF4_
8

Salah satu cara untuk men-debug ini (dan untuk memastikan itu adalah pelanggaran protokol yang menyebabkan masalah), adalah dengan menggunakan Fiddler (Http Web Proxy) dan lihat apakah kesalahan yang sama terjadi. Jika tidak (misalnya Fiddler menangani masalah tersebut untuk Anda) maka Anda harus dapat memperbaikinya menggunakan flag UseUnsafeHeaderParsing.

Jika Anda mencari cara untuk menetapkan nilai ini secara terprogram, lihat contoh di sini: http://o2platform.wordpress.com/2010/10/20/dealing-with-the-server-committed-a-protocol-violation-sectionresponsestatusline /

Dinis Cruz
sumber
Fiddler memang sedang memperbaiki masalah yang saya alami dengan permintaan HTTP GET. Bisakah kita melihat apa yang dilakukan oleh fiddler?
Olivier MATROT
8

Banyak solusi berbicara tentang solusi, tetapi tidak tentang penyebab kesalahan yang sebenarnya.

Salah satu kemungkinan penyebab kesalahan ini adalah jika server web menggunakan pengkodean selain ASCIIatau ISO-8859-1untuk mengeluarkan bagian respons header. Alasan untuk menggunakanISO-8859-1 adalah jika Response-Phraseberisi karakter Latin yang diperluas.

Kemungkinan penyebab lain dari kesalahan ini adalah jika server web menggunakan UTF-8keluaran byte-order-marker (BOM). Misalnya, konstanta default Encoding.UTF8mengeluarkan BOM, dan mudah untuk melupakannya. Halaman web akan bekerja dengan benar di Firefox dan Chrome, tetapi HttpWebRequestakan gagal :). Perbaikan cepat adalah dengan mengubah server web untuk menggunakan pengkodean UTF-8 yang tidak mengeluarkan BOM, misalnya new UTF8Encoding(false)(yang OK selama Response-Phrasehanya berisi karakter ASCII, tetapi sebenarnya itu harus menggunakan ASCIIatau ISO-8859-1untuk header, dan kemudian UTF-8atau beberapa pengkodean lain untuk respons).

Kebencian
sumber
Ini respon terbaik. Ini menjelaskan mengapa server web berperilaku tidak semestinya. Terima kasih! (Saya harus meniru server web dengan soket karena masalah penerapan dengan HttpListener.)
Andrew Rondeau
6

Pengaturan mengharapkan 100 terus salah dan mengurangi waktu idle soket menjadi dua detik menyelesaikan masalah bagi saya

ServicePointManager.Expect100Continue = false; 
ServicePointManager. MaxServicePointIdleTime = 2000; 
Prashan Pratap
sumber
6

Skype adalah penyebab utama masalah saya:

Galat ini biasanya terjadi ketika Anda telah menyiapkan Visual Studio untuk men-debug aplikasi web yang sudah ada yang berjalan di IIS daripada yang dibangun di ASP.NET server web debug bawaan . IIS secara default mendengarkan permintaan web pada port 80. Dalam hal ini, aplikasi lain sudah mendengarkan permintaan pada port 80. Biasanya, aplikasi yang melanggar adalah Skype, yang secara default mengambil alih mendengarkan pada port 80 dan 443 saat diinstal. Skype sudah menempati port 80. Jadi IIS tidak dapat memulai.

Untuk mengatasi masalah tersebut ikuti langkah-langkah:

Skype -> Alat -> Opsi -> Lanjutan -> Koneksi:

Hapus centang "Gunakan port 80 dan 443 sebagai alternatif untuk koneksi masuk".

Dan seperti yang ditunjukkan di bawah ini, lakukan reset IIS setelah selesai.

AltF4_
sumber
2
dan ingat untuk memulai ulang IIS setelah melakukannya
Ahmed Galal
3

Saya mencoba mengakses Last.fm Rest API dari belakang proxy dan mendapatkan kesalahan terkenal ini.

Server melakukan pelanggaran protokol. Bagian = ResponseStatusLine

Setelah mencoba beberapa solusi, hanya keduanya yang berhasil untuk saya

HttpWebRequest HttpRequestObj = WebRequest.Create(BaseUrl) as HttpWebRequest;
HttpRequestObj.ProtocolVersion = HttpVersion.Version10;

dan

HttpWebRequest HttpRequestObj = WebRequest.Create(BaseUrl) as HttpWebRequest;
HttpRequestObj.ServicePoint.Expect100Continue = false;
nixda
sumber
2

Tidak ada solusi yang berhasil untuk saya, jadi saya harus menggunakan WebClient daripada HttpWebRequest dan masalahnya tidak ada lagi.

Saya perlu menggunakan CookieContainer, jadi saya menggunakan solusi yang diposting oleh Pavel Savara di utas ini - Menggunakan CookieContainer dengan kelas WebClient

hapus saja "dilindungi" dari baris ini:

private readonly CookieContainer container = new CookieContainer ();

TH Todorov
sumber
2

Kemungkinan penyebab masalah ini adalah konfigurasi Web Proxy Auto Discovery Protocol (WPAD) di jaringan. Permintaan HTTP akan dikirim secara transparan ke proxy yang dapat mengirim kembali tanggapan yang tidak akan diterima atau tidak dikonfigurasi untuk diterima oleh klien. Sebelum meretas kode Anda menjadi bit, periksa apakah WPAD tidak berfungsi, terutama jika ini baru saja "mulai terjadi" secara tiba-tiba.

Skrymsli
sumber
2

Masalah saya adalah saya menelepon httpstitik akhir dengan http.

gneric.dll
sumber
1

Hal pertama yang kami coba adalah menonaktifkan kompresi konten dinamis untuk IIS, yang memecahkan kesalahan tetapi kesalahan tidak disebabkan sisi server dan hanya satu klien yang terpengaruh oleh ini.

Di sisi klien kami menghapus instalan klien VPN, mengatur ulang pengaturan internet, dan kemudian menginstal ulang klien VPN. Kesalahan juga bisa disebabkan oleh antivirus sebelumnya yang memiliki firewall. Kemudian kami mengaktifkan kembali kompresi konten dinamis dan sekarang berfungsi dengan baik seperti sebelumnya.

Kesalahan muncul di aplikasi kustom yang menghubungkan ke layanan web dan juga di TFS.

HasanG
sumber
0

Dalam kasus saya, IIS tidak memiliki izin yang diperlukan untuk mengakses jalur ASPX yang relevan.

Saya memberikan izin pengguna IIS ke direktori yang relevan dan semuanya baik-baik saja.

Vaiden
sumber
0

Lihat kode Anda dan temukan apakah Anda menyetel beberapa header dengan NULL atau nilai kosong.

Abdul Rauf
sumber
0

Saya mulai mendapatkan kesalahan ini dari layanan JSON / REST php saya

Saya mulai mendapatkan kesalahan dari unggahan POST relativley langka setelah saya menambahkan ob_start("ob_gzhandler")ke skrip GET php yang paling sering diakses

Saya bisa menggunakan adil ob_start(), dan semuanya baik-baik saja.

Patrick
sumber