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:
- mesin pengguna akhir dikonfigurasikan (dalam Pengaturan Internet) untuk menggunakan proxy yang tidak mengerti HTTP 1.1
- klien akhirnya mengirim sesuatu yang tidak dimengerti oleh proxy HTTP 1.0 (umumnya
Expect
header sebagai bagian dari HTTP POST
atau PUT
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 via System.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)
public class MyNotAssumingHttp11ProxiesAndServersProxy : MyWS
{
protected override WebRequest GetWebRequest(Uri uri)
{
HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(uri);
request.ProtocolVersion = HttpVersion.Version10;
return request;
}
}
(di mana MyWS
proksi yang ditambahkan oleh wizard Referensi Web pada Anda.)
UPDATE: Ini alat yang saya gunakan dalam produksi:
class ProxyFriendlyXXXWs : BasicHttpBinding_IXXX
{
public ProxyFriendlyXXXWs( Uri destination )
{
Url = destination.ToString();
this.IfProxiedUrlAddProxyOverriddenWithDefaultCredentials();
}
// Make it squirm through proxies that don't understand (or are misconfigured) to only understand HTTP 1.0 without yielding HTTP 417s
protected override WebRequest GetWebRequest( Uri uri )
{
var request = (HttpWebRequest)base.GetWebRequest( uri );
request.ProtocolVersion = HttpVersion.Version10;
return request;
}
}
static class SoapHttpClientProtocolRealWorldProxyTraversalExtensions
{
// OOTB, .NET 1-4 do not submit credentials to proxies.
// This avoids having to document how to 'just override a setting on your default proxy in your app.config' (or machine.config!)
public static void IfProxiedUrlAddProxyOverriddenWithDefaultCredentials( this SoapHttpClientProtocol that )
{
Uri destination = new Uri( that.Url );
Uri proxiedAddress = WebRequest.DefaultWebProxy.GetProxy( destination );
if ( !destination.Equals( proxiedAddress ) )
that.Proxy = new WebProxy( proxiedAddress ) { UseDefaultCredentials = true };
}
}