Tôi có một số mã chạy trong một ApiController (ASP.Net Web API) mà chính nó muốn thực hiện một yêu cầu GET đến một dịch vụ web khác. Dịch vụ web (cũng là một phần của ứng dụng của tôi) trả về các tiêu đề Cache-Control cho biết thời gian hết hạn cho nội dung nó trả về.WebRequest.CachePolicy có nên hoạt động từ mã chạy trong IIS không?
Tôi đang sử dụng mới System.Net.Http.HttpClient
, cấu hình với một WebRequestHandler
để sử dụng client-side caching (mặc định HttpClientHandler
không hỗ trợ cấu hình bộ nhớ cache, mặc dù nó sử dụng System.Net.WebRequest
như thực hiện HTTP cơ bản của nó):
var client = new HttpClient(new WebRequestHandler {
UseDefaultCredentials = true,
CachePolicy = new RequestCachePolicy(RequestCacheLevel.Default)
});
var response = client.GetAsync("someUri").Result;
response.EnsureSuccessStatusCode();
trên máy chủ tôi cho phép bộ nhớ đệm trong hành động điều khiển của tôi qua ...
var response = new HttpResponseMessage(HttpStatusCode.OK);
response.Headers.CacheControl = new CacheControlHeaderValue {
Public = true,
MaxAge = new TimeSpan(0, 5, 0); // Five minutes in this case
};
// Omitted, some content is added to the response
return response;
trên đây (viết tắt) mã hoạt động chính xác trong một bài kiểm tra; Tôi thực hiện nhiều cuộc gọi đến dịch vụ theo cách này và chỉ cuộc gọi đầu tiên thực sự liên lạc với dịch vụ (được quan sát qua các thông điệp tường trình trên dịch vụ trong IIS); các cuộc gọi tiếp theo sử dụng bộ nhớ cache.
Tuy nhiên, chạy cùng một mã được lưu trữ trên IIS, có vẻ như HttpClient
bỏ qua kết quả bộ nhớ đệm (tôi cũng đã thiết lập vùng chứa IoC của mình sao cho chỉ có một phiên bản của HttpClient
tồn tại trong AppDomain) và gọi dịch vụ thời gian. Điều này đang chạy như AppPoolIdentity.
Điều thú vị là nếu tôi thay đổi nhóm ứng dụng để chạy dưới dạng NetworkService, thì phản hồi có mã trạng thái 401 Không được ủy quyền (Tôi đã thử đặt Preauthenticate = true
trên số WebRequestHandler
nhưng mã trạng thái vẫn là 401). Điều này cũng đúng nếu tôi thay đổi nhóm ứng dụng để chạy theo thông tin đăng nhập của riêng tôi.
Vì vậy, có điều gì đó về việc chạy App Pool dưới danh tính NetworkService và AppPoolIdentity ảo, ngăn chúng sử dụng bộ nhớ đệm phía máy khách. Nội dung được lưu trong bộ nhớ cache bởi WebRequest
về mặt vật lý tồn tại là gì?
Bạn đã bao giờ bán được sự cố chưa? Tôi gặp vấn đề chính xác như nhau. – Chad
Nope không giải quyết được vấn đề, rearchitected giải pháp của tôi để có được xung quanh nó. –