2013-11-28 16 views
7

Khi sử dụng HttpClient trong .net 4.5 để thực hiện xác thực cơ bản, tôi thấy rằng nó đang phát hành 2 yêu cầu.HttpClient in .net đưa ra 2 yêu cầu khi cung cấp tên người dùng và mật khẩu trong NetworkCredentials

Việc đầu tiên không thành công với HTTP/1.1 401 trái phép và sau đó nó gửi lại yêu cầu mà chúng tôi nhận được HTTP/1.1 200 OK.

Bất kỳ ý tưởng nào về cách ngăn không cho làm điều này?

var credential = new NetworkCredential 
{ 
    UserName = username, 
    Password = password 
} 
var httpClientHandler = new System.Net.Http.HttpClientHandler 
{ 
    Credentials = credential 
}; 
httpClient = new HttpClient(httpClientHandler, true) 
{ 
    BaseAddress = address 
}; 

Trả lời

1

Bạn có thể thử thiết HttpClientHandler.PreAuthenticate như mỗi câu trả lời Tobberoth, mặc dù các tài liệu cho rằng gợi ý nó sẽ chỉ giúp sau khi yêu cầu đầu tiên:

Với ngoại lệ của các yêu cầu đầu tiên, Thuộc tính PreAuthenticate cho biết có gửi thông tin xác thực với các yêu cầu tiếp theo tới một Uri khớp với Uri cụ thể tới dấu gạch chéo cuối cùng mà không phải đợi máy chủ thử thách hay không.

Nó sẽ không giúp cho yêu cầu đầu tiên, nhưng nó có thể giúp giảm số lượng chuyến đi khứ hồi sau đó.

Một điều khác cần thử là bao gồm "Ủy quyền" trong HttpClient.DefaultRequestHeaders. Tôi sẽ hơi ngạc nhiên nếu điều đó có hiệu quả, nhưng ít nhất cũng đáng thử.

+0

Chúng tôi vẫn nhận được 401 với PreAuthenitcate = true, nhưng không nhiều, chạy thử nghiệm tích hợp cho 9 yêu cầu chúng tôi vẫn nhận được 401 phản hồi, trong khi không có cài đặt này, chúng tôi sẽ nhận được 9. –

+1

@IanOakes đã được xử lý và do đó đóng kết nối. Điều đó có lẽ sẽ khiến cho điệu nhảy 401 trở lại. –

5

Cố gắng thiết lập này:

httpClientHandler.PreAuthenticate = true; 

Tôi nghĩ rằng yêu cầu đầu tiên vẫn sẽ nhận được ban đầu 401, nhưng yêu cầu tiếp theo với cùng URI lên đến dấu gạch chéo cuối cùng sẽ luôn gửi các tiêu đề xác thực mà không có sự 401 .

+2

Tôi cũng nghĩ rằng, nhưng tài liệu cho thấy rằng sẽ không hoạt động - nó sẽ vẫn không gửi thông tin xác thực cho yêu cầu đầu tiên. –

+0

Vâng, tôi thấy điều tương tự, khiến tôi cho rằng không có cách nào để làm HttpClient làm điều này, trừ khi bạn tự tạo tiêu đề cho yêu cầu ban đầu (điều này rõ ràng là khá dễ dàng, nhưng đáng ghét). – Tobberoth

+1

Tôi đã thử PreAuthenticate = true, nhưng nó dường như không thay đổi bất cứ điều gì, tôi vẫn nhận được 401 theo sau là 200 –

0

trong khi tìm kiếm một câu trả lời cho một vấn đề tôi có với các NetworkCredentials tôi stumbled trên hai câu hỏi với câu trả lời đó có thể là những người bạn đang tìm kiếm:

Here câu trả lời của ays rằng ít nhất WebRequest có hành vi mặc định chỉ gửi thông tin đăng nhập sau khi nhận được 401. Và here có vẻ như giải pháp có thể đang sử dụng CredentialCache.

Tôi không chắc liệu CredentialCache có hoạt động với HttpClient hay không, nhưng nếu không, bạn có thể chuyển sang WebRequest hoặc WebClient, hoặc có thể thông tin này đã đưa bạn đến đường dẫn đến giải pháp khác.

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