2012-06-11 34 views
13

Uygulamamıza HTTP istekleri yapmak için HTTPWebRequest nesnelerini kullanıyoruz ve istek kimlik doğrulaması gerektirdiğinde bir sorun yaşıyoruz ve şeffaf bir proxy var (Squid 3.1.10).HTTPWebRequest.GetResponse(), kimliği doğrulanmış bir proxy aracılığıyla kimliği doğrulanmış isteklerde başarısız oluyor

string url = "http://www.icode.co.uk/test/auth.php"; 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
request.Credentials = new NetworkCredential("username", "password"); 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
Stream stream = response.GetResponseStream(); 
StreamReader reader = new StreamReader(stream); 

MessageBox.Show(reader.ReadToEnd()); 

reader.Close(); 
stream.Close(); 
response.Close(); 

Orijinal kodumuzda aynı sorunla karşılaşan WebClient sınıfı kullanılmıştır.

Bu kod ilk çalıştırdığında, doğru sonucu görüntüler. Kod ikinci kez çalıştırıldığında , onunla GetResponse() satırda başarısız: Windows 7'de

System.Net.WebException was unhandled 
    Message="The server committed a protocol violation. Section=ResponseStatusLine" 
    Source="System" 
    StackTrace: 
     at System.Net.HttpWebRequest.GetResponse() 
     at Dummy.DummyForm.button1_Click(Object sender, EventArgs e) in H:\Trial\Dummy\DummyForm.cs:line 42 
     at ... 

, süreci yeniden başlatmayı o kurtarmak ve bir kez çalışmaya neden olur, ancak Server 2003 tam yeniden başlatma gerektirir.

network capture baktığımızda, iki istekleri başlangıç ​​doğrulanmamış istek gönderilir ve Content-Length görmezden geliyor sanki sunucu yanıt, ancak başarısız istekleri ilk cevapta ortasında 2 doğrulanmış isteği gönderir edilir başlamak aynıdır başlık (hangisi doğrudur). Daha sonra ilk yanıtın geri kalanını alır ve protokol hatasıyla başarısız olur.

Wireshark capture

Bu istemci ( HTTPWebRequest) temiz olsa bağlantıyı kapatmak etmediğini garip görünüyor.

beklendiği gibi vekil kullanımı (sigara noktası 80 veya dahili trafik) istekleri bütün iş değildir. Kimlik doğrulama olmadığında, yalnızca tek isteği yaptığından çalışır.

Zaten minimuma sorun kodunu azaltılmış ve MSDN numunesi ile çoğaltılabilir, ama herkes bu bilinen bir sorun veya (NET veya Squid) yapılandırmasında bir sorun olup olmadığını bilen var mı ettik?

+0

sorunun yattığı yer bu olup olmadığından emin, ama ne zaman yapılır sizin StreamReader kapatmak için emin yapıyoruz değil mi? –

+0

Ekran görüntüsünü eklediğiniz için teşekkür ederiz. Yetkilendirme bilgisini ilk GET'den çıkardınız mı yoksa hiç içermediniz mi? –

+0

Uygulamamın geçerli olmadığı anlaşıldığından cevabımı kaldırdım. –

cevap

1

sadece ikinci kez başarısız olduğundan,

request.KeepAlive = false; 

fark ederdi?

+0

Bu [yap] (http://stackoverflow.com/questions/10984264/httpwebrequest-getresponse-failing-with-authenticated-requests-through-a-trans/11190526#comment14393611_10984264) ancak bunu bir İlk sorun için bir düzeltmeden ziyade bir geçici çözüm olarak kalıcı düzeltmek. Yine de kabul edeceğim – Deanna

0

ben NTLM kimlik doğrulaması (NetworkCredential) SQUID şeffaf vekil özelliği ile aynı anda çalışmıyor düşünüyorum. :-(

http://www.squid-cache.org/mail-archive/squid-users/201110/0025.html

başka kimlik doğrulama şeması deneyebilir misiniz?

+0

NTLM kimlik doğrulamasını kullanmıyorum. 'NetworkCredential' nesnesi şeması agnostiktir. Proxy, kimlik doğrulaması yapılmıyor, yalnızca temel kimlik doğrulamasıyla talep ettiğimiz HTTP kaynağı. – Deanna

0

kendini doğrulamak deneyin ,

request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(username + ":" + password)); 
ile

, request.GetResponse();

Bu benim için çalıştı. Öncelikle işe yaramadı bütün dize kendimi koyarak çalıştı!