2013-06-06 29 views
9

Tôi đang gọi một dịch vụ web từ một ứng dụng WinForms. Mọi thứ hoạt động tốt khi máy chủ proxy không được sử dụng, tuy nhiên khi proxy đang được sử dụng, ứng dụng gặp sự cố thay vì phản hồi XML mà nó mong đợi cho yêu cầu SOAP, nó nhận được trang lỗi HTML có nội dung "Yêu cầu xác thực".Làm thế nào tôi có thể nhận được WebClient (máy khách web) để tự động sử dụng máy chủ proxy mặc định?

Có vẻ như bạn có thể thiết lập proxy bằng tay như thế này:

WebClient client = new WebClient(); 
WebProxy wp = new WebProxy("proxy server url here"); 
client.Proxy = wp; 

... nhưng đến một mức độ nào, có vẻ như được nhìn thấy máy chủ proxy nào KHÔNG thực hiện ở trên, như các lỗi phát sinh thực sự đến từ máy chủ proxy. Nó dường như không nhận được thông tin đăng nhập Windows Authentication từ máy tính của người dùng. Làm thế nào tôi có thể buộc nó để làm điều này? Trên máy của riêng tôi nếu tôi mô phỏng điều này bằng cách sử dụng Fiddler (và kích hoạt tùy chọn "Yêu cầu xác thực proxy"), tôi nhận được một hộp thoại bật lên yêu cầu thông tin xác thực đăng nhập, nhưng điều này dường như không xảy ra trên máy của khách hàng của tôi (người sử dụng proxy phần cứng thực - McAfee Web Gateway).

Tôi làm cách nào để xử lý việc này? Tôi có cần cung cấp hộp thoại cho người dùng để định cấu hình máy chủ theo cách thủ công hay không và có cài đặt để cho WebClient sử dụng proxy mặc định của Windows và thông tin xác thực đăng nhập của người dùng không?

Cập nhật

Có vẻ như bạn có thể nhấc máy chủ proxy sử dụng mã dưới đây, nhưng điều đó không gây ra hộp thoại xác thực xuất hiện trong mọi tình huống (hoạt động trên một số máy tính nhưng không phải trên những người khác):

IWebProxy defaultProxy = WebRequest.DefaultWebProxy; 
if (defaultProxy != null) 
{ 
    defaultProxy.Credentials = CredentialCache.DefaultCredentials; 
    client.Proxy = defaultProxy; 
} 

Nếu mã trên là chính xác, tôi không hiểu tại sao một số người dùng sẽ không được nhắc nhập thông tin của họ. Tôi có phải nhập mã của riêng mình để thu thập thông tin đăng nhập của người dùng và cung cấp chúng cho đối tượng WebRequest không?

+0

Các bạn đã nhìn vào [WindowsIdentity.Impersonate Phương pháp] (http://msdn.microsoft.com/en-us/library/w070t6ka%28v=vs.100%29.aspx) ? –

+1

Bạn không chắc chắn điều đó có liên quan vì ứng dụng của tôi đã chạy như người dùng cục bộ mà tôi nghĩ? – NickG

+0

Doh, xấu của tôi ... Tôi đã giao dịch với SQL CLRSprocs quá nhiều gần đây ... "Khi tất cả các bạn [sử dụng] là một cái búa ..." –

Trả lời

0

Trước tiên hãy thử sử dụng này:

WebProxy proxy = (WebProxy) WebRequest.DefaultWebProxy; 
if (proxy.Address.AbsoluteUri != string.Empty) 
{ 
    Console.WriteLine("Proxy URL: " + proxy.Address.AbsoluteUri); 
    client.Proxy = proxy; 
} 

nếu điều này không hoạt động thử với:

WebProxy proxy = WebProxy.GetDefaultProxy() 
client.Proxy = proxy; 
+1

WebPRoxy.GetDefaultProxy không được chấp nhận. –

16

Hãy thử thêm

<system.net> 
    <defaultProxy useDefaultCredentials="true" /> 
    </system.net> 

đến file app.config của bạn

+0

Hoàn hảo, thật khó để tìm thấy câu trả lời này trên Google ... – GONeale

+0

Không hiệu quả với tôi. – NickG

+1

trong web.config nó cũng giúp ích. nên được đặt trong Stanislav

3
using (WebClient webClient = new WebClient()) 
{ 

    webClient.UseDefaultCredentials = true; 
    webClient.Proxy = WebRequest.GetSystemWebProxy(); 
} 

này nên làm việc

+0

Không hoạt động đối với tôi, tôi vẫn nhận được "Yêu cầu xác thực proxy 407" –

+0

Xem https://stackoverflow.com/questions/299940/how-should-i-set-the-default- proxy-to-use-default-credentials –