Tôi có một ứng dụng web (được lưu trữ trong IIS) để nói chuyện với một dịch vụ Windows. Dịch vụ Windows đang sử dụng API Web MVC của ASP.Net (tự lưu trữ) và do đó có thể được liên lạc qua http bằng JSON. Ứng dụng web được cấu hình để thực hiện mạo danh, ý tưởng là người dùng đưa ra yêu cầu cho ứng dụng web phải là người dùng mà ứng dụng web sử dụng để thực hiện yêu cầu dịch vụ. Cấu trúc trông như thế này:
(Người dùng được tô sáng màu đỏ là người dùng được nhắc đến trong các ví dụ bên dưới.)
Ứng dụng web tạo yêu cầu cho dịch vụ Windows bằng cách sử dụng HttpClient
:
var httpClient = new HttpClient(new HttpClientHandler()
{
UseDefaultCredentials = true
});
httpClient.GetStringAsync("http://localhost/some/endpoint/");
Điều này thực hiện yêu cầu đối với dịch vụ Windows, nhưng không chuyển thông tin xác thực một cách chính xác (dịch vụ báo cáo người dùng là IIS APPPOOL\ASP.NET 4.0
). Đây không phải là điều tôi muốn xảy ra .
Nếu tôi thay đổi mã trên để sử dụng WebClient
thay thế, thông tin đăng nhập của người dùng sẽ được chuyển chính xác:
WebClient c = new WebClient
{
UseDefaultCredentials = true
};
c.DownloadStringAsync(new Uri("http://localhost/some/endpoint/"));
Với đoạn mã trên, dịch vụ báo cáo người dùng là người dùng đã yêu cầu ứng dụng web.
Tôi đang làm gì sai với việc HttpClient
triển khai khiến nó không vượt qua được thông tin đăng nhập một cách chính xác (hoặc đó là một lỗi với HttpClient
)?
Lý do tôi muốn sử dụng HttpClient
là vì nó có API async hoạt động tốt với Task
s, trong khi WebClient
API asyc cần phải được xử lý với các sự kiện.
DownloadStringTaskAsync
.Net 4.5, cũng có thể được sử dụng với async / await
HttpClient
không có SetCredentials()
phương pháp. Bạn có thể chỉ cho tôi những gì bạn có ý nghĩa?
new HttpClient(new HttpClientHandler() { AllowAutoRedirect = true, UseDefaultCredentials = true }
trên máy chủ web được truy cập bởi người dùng được xác thực Windows và trang web đã xác thực cho một tài nguyên từ xa khác sau đó (sẽ không xác thực nếu không đặt cờ).