2009-08-06 25 views
6

Tôi đang cố gắng sử dụng lớp System.Net.HttpWebRequest để thực hiện yêu cầu HTTP GET cho một máy chủ web cụ thể cho các ứng dụng web mà chúng tôi đã cân bằng tải trên nhiều máy chủ. Để đạt được điều này, tôi cần có thể thiết lập giá trị tiêu đề Máy chủ cho yêu cầu và tôi đã có thể đạt được điều này bằng cách sử dụng lớp System.Net.WebProxy.Cách đặt giá trị tiêu đề Máy chủ cho các yêu cầu SSL bằng cách sử dụng HttpWebRequest

Tuy nhiên, tất cả điều này đều bị hỏng khi tôi cố gắng thực hiện GET bằng SSL. Khi tôi cố gắng thực hiện điều này, lệnh gọi đến HttpWebRequest.GetResponse ném một System.Net.WebException, với mã trạng thái HTTP là 400 (Yêu cầu Xấu).

Là những gì tôi đang cố gắng để đạt được với HttpWebRequest, hoặc tôi nên tìm kiếm một cách khác để thực hiện những gì tôi muốn?

Đây là mã tôi đã sử dụng để thử và nhận tất cả điều này để làm việc: -

using System; 
using System.Web; 
using System.Net; 
using System.IO; 

namespace UrlPollTest 
{ 
    class Program 
    { 
     private static int suffix = 1; 
     static void Main(string[] args) 
     { 
      PerformRequest("http://www.microsoft.com/en/us/default.aspx", "www.microsoft.com"); 
      PerformRequest("https://www.microsoft.com/en/us/default.aspx", ""); 
      PerformRequest("https://www.microsoft.com/en/us/default.aspx", "www.microsoft.com"); 

      Console.WriteLine("Press any key to continue"); 
      Console.ReadKey(); 
     } 

     static void PerformRequest(string AUrl, string AProxy) 
     { 
      Console.WriteLine("Fetching from {0}", AUrl); 
      try 
      { 
       HttpWebRequest request = WebRequest.Create(AUrl) as HttpWebRequest; 
       if (AProxy != "") 
       { 
        Console.WriteLine("Proxy = {0}", AProxy); 
        request.Proxy = new WebProxy(AProxy); 
       } 

       WebResponse response = request.GetResponse(); 
       using (Stream httpStream = response.GetResponseStream()) 
       { 
        using (StreamReader reader = new StreamReader(httpStream)) 
        { 
         string s = reader.ReadToEnd(); 
         File.WriteAllText(string.Format("D:\\Temp\\Response{0}.html", suffix++), s); 
        } 
       } 
       Console.WriteLine(" Success"); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(" " + e.Message); 
      } 
     } 
    } 
} 
+0

Câu hỏi chính hãng: Làm thế nào để bạn biết mình cần một tiêu đề lưu trữ? "Tiêu đề lưu trữ HTTP 1.1 không được hỗ trợ khi bạn sử dụng SSL" http://support.microsoft.com/kb/187504. – russau

+0

Suy nghĩ thứ hai: bạn có thể tải tệp qua SSL trong trình duyệt không? – russau

+1

Tôi cần đặt tiêu đề Máy chủ để tôi có thể chỉ định máy chủ chính xác được truy cập nếu ứng dụng web được cân bằng tải trên nhiều máy chủ. Mã này là một phần của một khuôn khổ giám sát và kiểm tra web tôi đang viết. Và có, các yêu cầu SSL mà tôi đang cố gắng thực hiện sẽ hoạt động trong trình duyệt, do đó, vấn đề nằm ở đâu đó trong cách tôi đang cố triển khai chức năng tương tự trong mã. Bài viết bạn đã liên kết gợi ý rằng hỗ trợ tiêu đề Máy chủ cho các yêu cầu SSL đã có sẵn trong Windows Server 2003 SP1 và tất cả các máy chủ của chúng tôi sẽ được vá hoàn toàn. – Cleggy

Trả lời

2

Tôi đã sử dụng một cách tiếp cận hacky trước - của việc có một exe thử nghiệm mà sửa đổi của tôi "hosts" tập tin, tiêm một mục nhập cho tên trang trại đến địa chỉ của máy chủ cụ thể (và phát hành một ipconfig /flushdns). Sau đó, các yêu cầu sẽ được chuyển đến máy chủ phù hợp như thể nó là người duy nhất ở đó.

Rõ ràng điều này yêu cầu quyền truy cập quản trị ... Tôi sử dụng nó như một phần của thử nghiệm khói tự động để truy cập trang trại như thể đó là các máy riêng lẻ.

Điều khác bạn có thể thử là một thứ gì đó trên NLB, có lẽ trong TCL (trong trường hợp của F5) - có thể thêm tiêu đề tùy chỉnh mà NLB hiểu? (giả sử nó đang thực hiện tái ký SSL).

+0

Cảm ơn bạn đã đề xuất, nhưng điều đó sẽ không hiệu quả đối với chúng tôi. Chúng tôi sẽ chạy nhiều luồng cùng một lúc và chắc chắn có thể có xung đột nhập HOSTS trong trường hợp đó. –

0

Trong .NET 4.0, tiêu đề máy chủ có thể được đặt độc lập với URL mà yêu cầu sẽ đến để tôi khuyên bạn nên sử dụng HttpwebRequest.Host để giải quyết vấn đề của mình. Điều này (tôi nghĩ) sẽ xuất xưởng như một phần của .NET 4.0 beta2. Không có cách nào để viết lại tiêu đề máy chủ khác với các phiên bản trước của .Net mà không triển khai lớp con tùy chỉnh của riêng bạn của WebRequest (tin tôi đi, nó đã được thử).

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