2009-04-26 14 views
12

Tôi đang cố gắng tải xuống một số dữ liệu từ cá thể dịch vụ báo cáo trên máy chủ TFS của chúng tôi.
Cho rằng mã nên chạy trên một máy tính không phải là miền tham gia, tôi figured rằng tôi sẽ thiết lập các thông tin đăng nhập bản thân mình. Không may mắn, hãy nhận lại HTTP 401 trái phép. Ok, vì vậy tôi đã kết nối Fiddler để xem điều gì đang xảy ra.System.Net.WebClient thất bại một cách kỳ lạ

Nhưng đó là khi tôi nhận được Heisenberged - cuộc gọi hiện đã qua mà không gặp trục trặc. Vì vậy, xác thực đi qua với Fiddler kết nối, nhưng thất bại mà không có nó. Webclient có bị hỏng hay tôi thiếu một thứ gì đó sâu sắc ở đây không?

private void ThisWorksWhenDomainJoined() 
    { 
     WebClient wc = new WebClient(); 
     wc.Credentials = CredentialCache.DefaultNetworkCredentials; 
     wc.DownloadString("http://teamfoundationserver/reports/........"); //Works 
    } 

    private void ThisDoesntWork() 
    { 
     WebClient wc = new WebClient(); 
     wc.Credentials = new NetworkCredential("username", "password", "domain"); 
     wc.DownloadString("http://teamfoundationserver/reports/........"); //blows up wih HTTP 401 
    } 
+11

+1 cho việc sử dụng các nguyên tắc uncertaintly Heisenberg như một động từ, chưa bao giờ nghe một trong những trước! –

Trả lời

4

Hãy xem liên kết này:
HTTP Authorization and .NET WebRequest, WebClient Classes

tôi đã có vấn đề tương tự như bạn. Tôi chỉ thêm một dòng và nó bắt đầu hoạt động. Hãy thử điều này

private void ThisDoesntWork() 
    { 
     WebClient wc = new WebClient(); 
     wc.Credentials = new NetworkCredential("username", "password", "domain"); 
     //After adding the headers it started to work ! 
     wc.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"); 
     wc.DownloadString("http://teamfoundationserver/reports/........"); //blows up wih HTTP 401 
    } 
+0

thêm dòng tiêu đề hoạt động tốt cho tôi! – viperguynaz

1

Điều gì xảy ra khi bạn sử dụng?

wc.Credentials = CredentialCache.DefaultCredentials; 

Ngoài ra, bạn có chắc là bạn có tên người dùng, mật khẩu và tên miền chính xác không?

Ngoài ra: Tôi tự hỏi nếu Fiddler đang thay đổi xung quanh một số ký tự unicode khi .net phá vỡ chúng hoặc một cái gì đó như thế. Nếu người dùng/pass/domain của bạn có unicode, hãy thử thoát nó ra như "\u2638" thay vì "☺".

+3

Khi làm việc thông qua vấn đề tương tự với đồng nghiệp, chúng tôi đã xác định rằng người dùng đang truy cập dịch vụ web bằng thông tin đăng nhập địa phương của bạn, trong đó mã trong ứng dụng Asp.Net sẽ sử dụng thông tin đăng nhập của người dùng asp.net. t có quyền. – travis

2

Hãy thử này ...

var credCache = new CredentialCache(); 
credCache.Add(new Uri("http://teamfoundationserver/reports/........""), 
         "Basic", 
         new NetworkCredential("username", "password", "DOMAIN")); 
wc.Credentials = credCache; 

Nếu điều đó không làm việc, hãy thử thay thế "cơ bản" với "Negotiate".

1

tôi đã có thể để có được xung quanh lỗi này bằng cách sử dụng một đối tượng CredentialCache, như sau:

WebClient wc = new WebClient(); 
CredentialCache credCache = new CredentialCache(); 
credCache.Add(new Uri("http://mydomain.com/"), "Basic", 
new NetworkCredential("username", "password")); 

wc.Credentials = credCache; 

wc.DownloadString(queryString));