2010-01-25 65 views
8

Tôi đang làm việc trên ứng dụng .NET gọi các dịch vụ web của bên thứ ba qua internet. Các dịch vụ không sử dụng SOAP, vì vậy chúng tôi xây dựng thủ công một tài liệu yêu cầu XML, gửi nó tới dịch vụ thông qua HTTP và lấy một phản hồi XML.Lỗi xác thực proxy HTTP 407 khi gọi dịch vụ web

Mã của chúng tôi là dịch vụ Windows chạy trong ngữ cảnh của tài khoản miền Windows thông thường và nằm phía sau máy chủ proxy (Microsoft ISA Server) được định cấu hình để yêu cầu xác thực NTLM. Tài khoản đang chạy dịch vụ của chúng tôi có quyền truy cập internet thông qua máy chủ proxy.

Mã này trông như thế này:

// Create the request object. 
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url); 
request.Method = "POST"; 

// Configure for authenticating proxy server requiring Windows domain credentials. 
request.Proxy = New WebProxy(proxyAddress) { UseDefaultCredentials = true }; 

// Set other required headers. 
request.Accept = acceptableMimeType; 
request.Headers.Add(HttpRequestHeader.AcceptCharset, acceptableCharset); 
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "none"); 
request.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-gb"); 
request.Headers.Add(HttpRequestHeader.CacheControl, "no-store"); 
request.Headers.Add(HttpRequestHeader.ContentEncoding, "none"); 
request.Headers.Add(HttpRequestHeader.ContentLanguage, "en-gb"); 
request.ContentType = requestMimeType; 
request.ContentLength = requestBytes.Length; 

// Make the method call. 
using(Stream stream = request.GetRequestStream()) { 
    stream.Write(requestBytes, 0, requestBytes.Length); 
} 
HttpWebResponse response = (HttpWebResponse) request.GetResponse(); 

// Extract the data from the response without relying on the HTTP Content-Length header 
// (we cannot trust all providers to set it correctly). 
const int bufferSize = 1024 * 64; 
List<byte> responseBytes = new List<byte>(); 
using(Stream stream = new BufferedStream(response.GetResponseStream(), bufferSize)) { 
    int value; 
    while((value = stream.ReadByte()) != -1) { 
     responseBytes.Add((byte) value); 
    } 
} 

này hoạt động tốt nếu máy chủ proxy được tắt, hoặc các URL đã được danh sách trắng như không yêu cầu xác thực, nhưng ngay sau khi xác thực được kích hoạt, nó luôn luôn thất bại với lỗi HTTP 407.

Tôi đặt mã ở trên vào bộ phận thử nghiệm và thử mọi phương pháp tôi có thể nghĩ đến để định cấu hình thuộc tính request.Proxy, mà không thành công.

Sau đó, tôi nhận thấy rằng tất cả các dịch vụ web của bên thứ ba mà chúng tôi phải gọi là HTTPS. Khi tôi thử truy cập chúng dưới dạng HTTP thay vào đó, xác thực proxy bắt đầu hoạt động. Có một số hoop thêm tôi phải nhảy qua để có được xác thực proxy và HTTPS để chơi độc đáo?

PS: Các vấn đề tương tự cũng xảy ra với máy chủ proxy nguồn mở SmoothWall, vì vậy tôi không thể viết nó ra dưới dạng lỗi trong ISA Server.

PPS: Tôi biết rằng bạn có thể định cấu hình cài đặt proxy trong app.config, nhưng (a) thực hiện trong mã sẽ không tạo ra bất kỳ sự khác biệt nào và (b) thiết kế ứng dụng yêu cầu chúng tôi đọc cài đặt proxy từ cơ sở dữ liệu khi chạy.

Trả lời

2

Tôi nghĩ tôi sẽ phải viết ra câu hỏi này. Mã đăng gốc của tôi thỉnh thoảng xuất hiện. Máy chủ proxy của chúng tôi cực kỳ không đáng tin cậy; một phút nó sẽ chặn một kết nối internet từ bất kỳ phần mềm nào, và tiếp theo nó sẽ cho phép nó. Những người IT dường như bất lực để làm bất cứ điều gì về nó, và chúng tôi (tất cả mọi người bên ngoài bộ phận CNTT) không có quyền thay đổi cơ sở hạ tầng mạng.

Nếu có ai có ý tưởng về cách "làm cứng" mã của tôi để bù đắp cho máy chủ proxy không đáng tin cậy, thì tôi muốn được nghe chúng. :-)

+0

đó là những gì chính xác xảy ra trong thời gian case.some của tôi tôi có thể kết nối mà không có lỗi này. –

+3

Đăng như mẹo khắc phục sự cố cho những người dạo qua đây: Nó có thể là cấu hình máy chủ proxy/phần mềm, nhưng kiểm tra đầu tiên trong các vấn đề liên tục như thế này là loại bỏ một phần cụm thất bại. Nếu có nhiều máy chủ proxy phía sau bộ cân bằng tải và chỉ một máy chủ được định cấu hình đúng, bạn sẽ chỉ nhận được thông qua khi được cân bằng với trường hợp "tốt", aka. đôi khi. – Barryrowe

9

Bạn đã thử đặt proxy trong app.config chưa?

Để vô hiệu hóa các proxy, trong file App.config thêm cấu hình sau

<system.net> 
    <defaultProxy enabled="false" useDefaultCredentials="false"> 
    <proxy/> 
    <bypasslist/> 
    <module/> 
    </defaultProxy> 
</system.net> 

Để kích hoạt proxy và sử dụng các cài đặt proxy mặc định (quy định trong IE) thêm cấu hình này trong App.config của bạn

<system.net> 
    <defaultProxy enabled="true" useDefaultCredentials="true"> 
    <proxy/> 
    <bypasslist/> 
    <module/> 
    </defaultProxy> 
</system.net> 
+1

Tôi đã thử điều đó và tôi nhận được kết quả tương tự. Nó hoạt động tốt cho các địa chỉ HTTP, nhưng không thành công cho HTTPS. –

0

Có vấn đề gì với chứng chỉ của máy chủ proxy của bạn không? Nếu dịch vụ của bạn không thể thiết lập HTTPS thì dịch vụ sẽ phát sinh lỗi.

+0

Tôi đã hỏi quản trị viên CNTT của chúng tôi về điều này và họ nói rằng nó chắc chắn được cấu hình để hỗ trợ SSL. Họ đã duyệt thành công vào một trang web HTTPS qua máy chủ proxy. –

3

Tôi đã có một tình huống tương tự

Bạn có nhận thấy nó hoạt động khi bạn truy cập Internet trước khi bạn chạy mã không? và nếu bạn đã không truy cập internet cho lứa tuổi (20 phút cho tôi) bạn có lỗi.

bạn đã cố gắng đặt thông tin xác thực proxy trực tiếp chưa?

//setup the proxy 
request.Proxy = new WebProxy("proxyIp", 8080); 
request.Proxy.Credentials = CredentialCache.DefaultCredentials; 

Tôi vừa mới blogged về việc này.

Tôi hy vọng điều này cũng khắc phục được sự cố của bạn!

+0

Hi Dbones, cảm ơn bạn đã chia sẻ trải nghiệm của mình! Thật không may tôi đã quan sát thấy các máy chủ proxy không đột nhiên ngay cả sau khi kết nối thành công đã được thực hiện chỉ một vài giây trước đó. Ngoài ra tôi đã thực sự cố gắng rằng phương pháp chính xác xác định proxy trong mã, và nó không có sự khác biệt. –

+0

wow, tôi ghét phải nói, nhưng ở trên đã khắc phục được sự cố của tôi. Tôi hy vọng bạn có thể tìm thấy giải pháp cho tình huống của bạn – dbones

Các vấn đề liên quan