Ketika saya mencoba POST ke URL, hasilnya adalah pengecualian berikut:
Server jauh mengembalikan kesalahan: (417) Ekspektasi Gagal.
Berikut ini contoh kode:
var client = new WebClient();
var postData = new NameValueCollection();
postData.Add("postParamName", "postParamValue");
byte[] responseBytes = client.UploadValues("http://...", postData);
string response = Encoding.UTF8.GetString(responseBytes); // (417) Expectation Failed.
Menggunakan HttpWebRequest/HttpWebResponse
pasangan atau HttpClient
tidak tidak ada bedanya.
Apa yang menyebabkan pengecualian ini?
Expect
header yang secara default ditambahkan seperti halnyaExpect100Continue
secaratrue
default.Jawaban:
System.Net.HttpWebRequest menambahkan header 'HTTP header "Expect: 100-Continue"' untuk setiap permintaan kecuali Anda secara eksplisit memintanya untuk tidak mengatur properti statis ini menjadi false:
Beberapa server tersedak pada header itu dan mengirim kembali 417 kesalahan yang Anda lihat.
Cobalah.
sumber
Cara lain -
Tambahkan baris ini ke bagian konfigurasi file konfigurasi aplikasi Anda:
sumber
Situasi dan kesalahan yang sama ini juga dapat muncul dengan wizard default yang dihasilkan proksi SOAP Web Service (tidak 100% jika ini juga terjadi pada
System.ServiceModel
tumpukan WCF ) ketika saat runtime:Expect
header sebagai bagian dari HTTPPOST
atauPUT
permintaan karena konvensi protokol standar untuk mengirim permintaan dalam dua bagian sebagaimana dibahas dalam Catatan di sini )... menghasilkan 417.
Seperti yang tercakup dalam jawaban lain, jika masalah spesifik yang Anda temui adalah bahwa
Expect
header menyebabkan masalah, maka masalah spesifik tersebut dapat dialihkan dengan melakukan pematian global relatif dari transmisi PUT / POST dua bagian viaSystem.Net.ServicePointManager.Expect100Continue
.Namun ini tidak memperbaiki masalah mendasar yang mendasari - tumpukan mungkin masih menggunakan HTTP 1.1 hal-hal spesifik seperti KeepAlives dll. (Meskipun dalam banyak kasus jawaban lain mencakup kasus-kasus utama.)
Namun masalah sebenarnya adalah bahwa kode yang dibuat secara otomatis mengasumsikan bahwa tidak apa-apa untuk pergi secara buta menggunakan fasilitas HTTP 1.1 karena semua orang memahami hal ini. Untuk menghentikan asumsi ini untuk proksi Layanan Web tertentu, seseorang dapat mengubah mengabaikan default yang mendasari
HttpWebRequest.ProtocolVersion
dari default 1.1 dengan membuat kelas Proxy turunan yang menimpa seperti yang ditunjukkan dalam posting ini : -protected override WebRequest GetWebRequest(Uri uri)
(di mana
MyWS
proksi yang ditambahkan oleh wizard Referensi Web pada Anda.)UPDATE: Ini alat yang saya gunakan dalam produksi:
sumber
Apakah formulir yang Anda coba tiru memiliki dua bidang, nama pengguna dan kata sandi?
Jika demikian, baris ini:
tidak benar.
Anda memerlukan dua baris seperti:
Edit:
Oke, karena itu bukan masalahnya, salah satu cara untuk mengatasi ini adalah dengan menggunakan sesuatu seperti Fiddler atau Wireshark untuk menonton apa yang sedang dikirim ke server web dari browser dengan sukses, kemudian membandingkannya dengan apa yang dikirim dari kode Anda. Jika Anda pergi ke port normal 80 dari .Net, Fiddler masih akan menangkap lalu lintas ini.
Mungkin ada beberapa bidang tersembunyi lainnya pada formulir yang server web harapkan tidak Anda kirim.
sumber
Solusi dari sisi proxy, saya menghadapi beberapa masalah dalam proses handshake SSL dan saya harus memaksa server proxy saya untuk mengirim permintaan menggunakan HTTP / 1.0 untuk menyelesaikan masalah dengan menetapkan argumen ini di httpd.conf
SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1
setelah itu saya menghadapi kesalahan 417 sebagai aplikasi klien saya menggunakan HTTP / 1.1 dan proxy terpaksa menggunakan HTTP / 1.0, masalahnya diselesaikan dengan mengatur parameter ini di httpd.conf di sisi proxyRequestHeader unset Expect early
tanpa perlu mengubah apa pun di sisi klien, semoga ini membantu .sumber
Untuk Powershell itu
sumber
Jika Anda menggunakan " HttpClient ", dan Anda tidak ingin menggunakan konfigurasi global untuk memengaruhi semua program yang bisa Anda gunakan:
Saya Anda menggunakan " WebClient " Saya pikir Anda dapat mencoba menghapus tajuk ini dengan menelepon:
sumber
Dalam situasi saya, kesalahan ini tampaknya hanya terjadi jika komputer klien saya memiliki kebijakan firewall yang ketat, yang mencegah program saya untuk berkomunikasi dengan layanan web.
Jadi satu-satunya solusi yang bisa saya temukan adalah menangkap kesalahan dan memberi tahu pengguna tentang mengubah pengaturan firewall secara manual.
sumber
Pendekatan web.config berfungsi untuk panggilan layanan formulir InfoPath ke aturan yang diaktifkan layanan web IntApp.
sumber