2013-05-13 36 views
42

Tôi đang khắc phục sự cố với dịch vụ tôi gọi qua HttpClient của .NET, cố định tuyến yêu cầu qua proxy cục bộ (Fiddler), nhưng cài đặt proxy của tôi dường như không có hiệu lực .Sử dụng proxy với .NET 4.5 HttpClient

Đây là cách tôi tạo cho khách hàng:

private HttpClient CreateHttpClient(CommandContext ctx, string sid) { 
    var cookies = new CookieContainer(); 

    var handler = new HttpClientHandler { 
     CookieContainer = cookies, 
     UseCookies = true, 
     UseDefaultCredentials = false, 
     Proxy = new WebProxy("http://localhost:8888", false, new string[]{}), 
     UseProxy = true, 
    }; 

    // snip out some irrelevant setting of authentication cookies 

    var client = new HttpClient(handler) { 
     BaseAddress = _prefServerBaseUrl, 
    }; 

    client.DefaultRequestHeaders.Accept.Add(
     new MediaTypeWithQualityHeaderValue("application/json")); 

    return client; 
} 

sau đó tôi gửi yêu cầu theo:

var response = CreateHttpClient(ctx, sid).PostAsJsonAsync("api/prefs/", smp).Result; 

Yêu cầu đi thẳng đến máy chủ mà không cần cố gắng để đạt proxy. Tôi đã bỏ lỡ cái gì?

+0

Dịch vụ của bạn có được thử nghiệm trên máy cục bộ không? Xem xét bỏ qua proxy cho các địa chỉ cục bộ. – Xaqron

+0

Nhân tiện, việc tạo ra các cá thể 'HttpClient' rất tốn kém. Bạn nên sử dụng lại các trường hợp bất cứ khi nào có thể. Có một số bài đăng trên blog nói về điều này có thể truy cập bằng Google. – NathanAldenSr

Trả lời

7

Ah, The BaseAddress tôi đã trỏ đến là http://localhost:8081. Hóa ra rằng mặc dù thiết lập BypassOnLocal thành false, rõ ràng localhost vẫn đủ đặc biệt để nó bỏ qua proxy.

Tôi đã thêm một liên kết miền trong IIS, mục nhập tệp máy chủ để trỏ tên miền đó đến 127.0.0.1, được sử dụng tên miền mới được tạo, bây giờ nó hoạt động.

+6

Bạn cũng có thể sử dụng 'http: // localhost.: 8888' Chú ý dấu chấm ma thuật! –

+2

Tôi nhận được Yêu cầu Không hợp lệ - Tên Máy chủ Không hợp lệ khi tôi đặt. sau localhost – Michael

+0

@DarrelMiller Tôi không nhận được thay đổi nào sau khi tôi thêm localhost. ' ' – felickz

1

Fiddler có được định cấu hình để thu giữ lưu lượng truy cập từ tất cả các quy trình không? Nhìn vào thanh trạng thái nơi bạn thấy "Chụp hình". Nó sẽ hiển thị "Tất cả các quy trình" bên cạnh nó. Nếu nó hiển thị "Trình duyệt web", hãy nhấp vào nó và thay đổi nó cho tất cả các quy trình. Điều này có thể khác nhau tùy thuộc vào phiên bản của Fiddler bạn sử dụng.

38

Mã này đã làm việc cho tôi:

var httpClientHandler = new HttpClientHandler 
         { 
          Proxy = new WebProxy("http://localhost:8888", false), 
          UseProxy = true 
         } 

Lưu ý rằng tôi không cung cấp một mảng trống để xây dựng WebProxy tôi. Có lẽ đó là vấn đề?

+0

Loại bỏ các mảng chuỗi làm việc cho tôi quá. Tôi đã có một mục nhập để HOSTS để có được proxy để làm việc trên localhost. –

+0

Bạn vừa lưu ngày của tôi^_ ^ –

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