2016-03-29 27 views
11

Tôi biết có rất nhiều câu hỏi/câu trả lời, blog về điều này, không nói về Câu hỏi thường gặp của Telerik. Tuy nhiên tôi không thể tìm thấy điều này được chẩn đoán và giải quyết một cách thuần túy rõ ràng:Làm thế nào để sử dụng Fiddler với HttpClient?

Bối cảnh:

Tôi có một ứng dụng Web API, và tôi có một (unit test) khách hàng, trong đó sử dụng HttpClient để gửi yêu cầu vào API. Ứng dụng API Web nghe trong http://localhost:8631/ Đôi khi tôi sử dụng Fiddler để xem điều gì đang xảy ra.

Vấn đề:

giao thông giữa HttpClient tôi và Web API không bị bắt bởi Fiddler. Sau khi khởi chạy lưu lượng truy cập Fiddler vẫn OK, nhưng không được hiển thị trong Fiddler.

Diagnostics cho đến nay:

  • Chú ý: Sử dụng bất kỳ trình duyệt và gửi yêu cầu để http://localhost:8631/đang làm việc, ý tôi là: giao thông bắt bởi Fiddler
  • Cấu hình HttpClient một cách rõ ràng để sử dụng Fiddler như proxy không giúp được gì.
  • Thay đổi HttpClient url http://localhost:8631/-http://localhost.fiddler: 8631/giúp, bất kể Proxy đã được cấu hình hay không.

Kết luận: Ít nhất trường hợp của tôi: Nó không phải là về HttpClient được cấu hình một cách rõ ràng để sử dụng Fiddler như proxy hay không. Đó là về hành vi localhost của HttpClient và/hoặc Fiddler.

Issue một lần nữa:

Người ta có thể đặt câu hỏi: Vấn đề được giải quyết, sau đó câu hỏi là gì? Vâng ...

Q1: này vẫn còn là một vấn đề đau đớn, bởi vì các url được mã hóa hoặc cấu hình ở đâu đó (Ý tôi là http://localhost:8631/hayhttp://localhost.fiddler: 8631 nên mỗi khởi động và dừng cáy nó phải Thêm: Kiểm tra trong nguồn để kiểm soát nguồn, và kiểm tra trên một máy khác bởi một đồng đội có thể gây ra vấn đề.Vì vậy: Có giải pháp nào ít đau đớn hơn cho việc này không?

Mã hóa cứng tên máy của tôi (cũng có có thể làm việc) gây ra cùng một nỗi đau và vấn đề khi làm việc trong một nhóm và sử dụng kiểm soát nguồn

Q2: Tại sao hành vi không nhất quán này: Tinh khiết http://localhost:8631/ hoạt động từ mọi trình duyệt chứ không phải từ HttpClient.

Tôi nghĩ rằng trả lời Q2 có thể khiến chúng tôi gần gũi hơn với cách giải quyết hữu ích hơn.

Mã trưng bày

// Using the following url w o r k s regardless of any proxy setting 
    // ...but it is a pain to hardcode or configure this and change depending on Fiddler is running or not 

    //private const string ApiUrl = "http://localhost.fiddler:8631/"; 

    // This is not working regardless any proxy setting. Trafic bypasses Fiddler 
    private const string ApiUrl = "http://localhost:8631/"; 

    protected HttpClient GetClient() 
    { 
     var httpClientHandler = new HttpClientHandler 
     { 
      // Does not work 
      //Proxy = new WebProxy("http://localhost:8888", false), 

      // Does not work 
      Proxy = WebRequest.DefaultWebProxy, 
      UseProxy = true 
     }; 


     var client = new HttpClient(httpClientHandler) 
     { 
      BaseAddress = new Uri(ApiUrl) 
     }; 
     // ... 
+0

Bạn * không * cần phải làm bất cứ điều gì để sử dụng Fiddler với HttpClient. Fiddler đặt/đặt lại proxy hệ điều hành mặc định để bạn * không * cần sửa đổi bất kỳ ứng dụng nào để sử dụng nó. Bạn chỉ có thể gặp sự cố nếu bạn ... cài đặt proxy hoặc chấm dứt Fiddler trước khi có cơ hội đặt lại proxy hệ điều hành, ví dụ: tắt –

+0

Để được trợ giúp về các vấn đề cụ thể bạn cần phải đăng mã thực tế , bao gồm bất kỳ sửa đổi nào đối với các cài đặt proxy system.net trong app.config –

+0

Bạn đã thử các tài liệu về fiddler cho .NET chưa? http://docs.telerik.com/fiddler/Configure-Fiddler/Tasks/ConfigureDotNETApp –

Trả lời

7

Vấn đề là việc Microsoft triển khai lớp WebProxy có kiểm tra tĩnh cho các url lặp (dựa trên danh sách các tên như "localhost") và sẽ bỏ qua bất kỳ proxy nào được xác định là vòng lặp. Ngay cả cài đặt BypassProxyOnLocal cũng không thành vấn đề. Cài đặt này chỉ có hiệu lực nếu bạn sử dụng tên máy cục bộ hoặc tên máy khác trong mạng cục bộ. Host localhost hoặc địa chỉ ip 127.0.0.1 luôn được coi là loopback và sẽ dẫn đến việc bỏ qua proxy.

phần có liên quan của mã .NET Framework là trong WebProxy.IsBypassedManual:

if (host.IsLoopback) { 
    return true; // bypass localhost from using a proxy. 
} 

Viết hậu duệ của riêng bạn của lớp WebProxy và ghi đè lên các phương pháp GetProxyIsBypassed để trả lại một uri sử dụng proxy ngay cả đối với các url loopback . Sau đó, gán một thể hiện của lớp đó cho HttpClientHandler mà bạn sử dụng để tạo ra HttpClient.

Dường như không hoạt động vì mã .net dự kiến ​​sẽ hoạt động với các đối tượng triển khai IAutoWebProxy, nhưng IAutoWebProxy được khai báo bên trong và không thể được sử dụng trong mã riêng của chúng tôi.

Giải pháp đơn giản nhất tôi thấy là có một tính năng thay thế "localhost" bằng tên máy cục bộ trong ApiUrl khi chạy. Tên máy cục bộ sẽ hoạt động bất kể Fiddler có đang chạy hay không.

+2

Đây là câu trả lời đúng. Xem thêm https: //visualstudio.uservoice.com/forums/121579-visual-studio-2015/gợi ý/6359204-support-the-loopback-token-in-proxy-bỏ qua danh sách – EricLaw

+0

Tôi sử dụng tên máy - và fiddler vẫn bỏ qua các cuộc gọi httpclient của tôi với các dịch vụ web dựa trên web và cục bộ ?! – niico

+0

@niico Bắt đầu câu hỏi mới với các chi tiết về mã của bạn. Có thể bạn có mã ngăn cản khách hàng sử dụng bất kỳ proxy nào hoặc bạn tự đặt proxy cụ thể? – NineBerry

-1

Chỉ cần xác định proxy mặc định để dụ HttpClient của bạn và nó hoạt động như một nét duyên dáng. Bạn không phải thay đổi bất kỳ URL nào trong mã của mình.

HttpClientHandler handler = new HttpClientHandler(); 
handler.Proxy = WebRequest.DefaultWebProxy; 
HttpClient client = new HttpClient(handler as HttpMessageHandler); 

Chúng tôi sử dụng cùng một hành vi mà không gặp bất kỳ sự cố nào (Windows 10, Fiddler4).

+0

Cảm ơn, đã thử. Thật không may điều này không giúp đỡ. Xin lưu ý trong phần Chẩn đoán, tôi đã viết về việc thiết lập rõ ràng proxy cho Fiddler cũng không giúp được gì. Tuy nhiên, sử dụng * localhost.fiddler * thay vì localhost sẽ giúp. Điều kỳ lạ khi sử dụng từ trình duyệt nó * hoạt động * mà không có doman .fiddler. –

+0

@ g.pickardou là Proxy của bạn một Proxy HTTP SOCK oder? Thông thường Fiddler nên tạo một Proxy HTTP. Chúng tôi sử dụng một Proxy HTTP và điều này hoạt động 100% trên tất cả các máy. Cũng tại khách hàng với Enterprise Proxy. – Ben

+0

Tôi hoàn toàn không có proxy. Fiddler là một proxy khi nó đang chạy. –

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