2012-06-11 26 views
13

Chúng tôi đang sử dụng các đối tượng HTTPWebRequest để thực hiện yêu cầu HTTP cho ứng dụng của chúng tôi và chúng tôi đang gặp sự cố khi yêu cầu xác thực và có proxy trong suốt (Mực 3.1.10).HTTPWebRequest.GetResponse() thất bại với các yêu cầu được xác thực thông qua proxy trong suốt

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(); 

Mã ban đầu của chúng tôi đã sử dụng lớp WebClient có cùng vấn đề.

Lần đầu tiên mã này chạy, nó sẽ hiển thị kết quả chính xác. Khi mã chạy một lần thứ hai, nó không thành công trên dòng GetResponse() với:

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 ... 

Trên Windows 7, khởi động lại quá trình này gây ra nó để phục hồi và làm việc một lần, nhưng Server 2003 đòi hỏi phải khởi động lại đầy đủ.

Nhìn vào network capture, hai yêu cầu giống hệt nhau để bắt đầu, yêu cầu chưa được xác thực ban đầu được gửi và máy chủ trả lời, nhưng yêu cầu không gửi yêu cầu được xác thực thứ 2 ở giữa câu trả lời ban đầu như thể bỏ qua Content-Length tiêu đề (chính xác). Sau đó nó nhận được phần còn lại của câu trả lời ban đầu và không thành công với lỗi giao thức.

Wireshark capture

Nó có vẻ kỳ quặc mà khách hàng (HTTPWebRequest) không đóng kết nối sạch mặc dù.

Khi proxy không được sử dụng (không phải cổng 80 hoặc lưu lượng nội bộ), các yêu cầu đều hoạt động như mong đợi. Khi không có xác thực, nó cũng hoạt động vì nó chỉ làm cho yêu cầu duy nhất.

Tôi đã giảm mã vấn đề xuống mức tối thiểu và sao chép nó bằng mẫu MSDN, nhưng có ai biết nếu đây là sự cố đã biết hoặc sự cố trong cấu hình (.NET hoặc Mực) của chúng tôi không?

+0

Không chắc chắn đây có phải là vấn đề nằm ở đâu không, nhưng bạn có chắc chắn đóng Trình quản lý luồng của mình khi bạn đã hoàn tất không? –

+0

Cảm ơn bạn đã thêm ảnh chụp màn hình. Bạn có bỏ thông tin Ủy quyền ra khỏi GET đầu tiên trong đó hay không, nó đã không bao gồm bất kỳ thông tin nào? –

+0

Tôi đã xóa câu trả lời của mình, vì rõ ràng là nó không áp dụng. –

Trả lời

1

Vì nó chỉ thất bại lần thứ hai,

request.KeepAlive = false; 

sẽ tạo sự khác biệt?

+0

Nó [không] (http://stackoverflow.com/questions/10984264/httpwebrequest-getresponse-failing-with-authenticated-requests-through-a-trans/11190526#comment14393611_10984264) nhưng tôi không muốn sử dụng nó như là một sửa chữa vĩnh viễn vì nó là một giải pháp thay vì sửa chữa cho vấn đề ban đầu. Tôi sẽ chấp nhận nó – Deanna

0

Tôi nghĩ xác thực NTLM (NetworkCredential) không hoạt động cùng lúc với tính năng proxy trong suốt của SQUID. :-(

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

Bạn có thể thử chương trình xác thực khác?

+0

Tôi không sử dụng xác thực NTLM. Đối tượng 'NetworkCredential' là sơ đồ bất khả tri. Proxy không được xác thực, chỉ là tài nguyên HTTP mà chúng tôi đang yêu cầu, với xác thực cơ bản. – Deanna

0

Hãy thử chứng thực bản thân , với

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

trước request.GetResponse();

Điều này phù hợp với tôi. Trước tiên, tôi đã cố gắng đặt toàn bộ chuỗi vào bản thân, điều này không hiệu quả!