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.
đó 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. –
Đă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