Ответ 1
Ответ, взяв это через несколько недель:
Заголовка Cache-Control, по-видимому, установлена на 'private' при запуске отладки. Проблема пропадает, когда я запускаю сборку релизов.
Я пытаюсь установить заголовки кеша в ASP.NET MVC Web API, но ответ от IIS предполагает, что установленные значения CacheControl игнорируются.
Мое первоначальное предположение заключалось в том, что я использовал EnableCorsAttribute в System.Web.Http.Cors, который необходим в этом случае использования. Однако даже без этого атрибута заголовок Cache-Control ответа по-прежнему 'private'.
Что-то я здесь делаю неправильно?
// GET api/<version>/content
// [EnableCors(origins: "*", headers: "*", methods: "*")]
public HttpResponseMessage Get(HttpRequestMessage request)
{
int cacheMaxAgeSeconds;
string cacheMaxAgeString = request.GetQueryString("cache-max-age") ?? request.GetQueryString("cache-max-age-seconds");
string rawUri = request.RequestUri.ToString();
try
{
cacheMaxAgeSeconds = cacheMaxAgeString == null ? Config.ApiCacheControlMaxSeconds : int.Parse(cacheMaxAgeString);
}
catch (Exception ex)
{
cacheMaxAgeSeconds = Config.ApiCacheControlMaxSeconds;
//...
}
try
{
//...
var response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent("...", Encoding.UTF8, "application/json")
};
response.Headers.CacheControl = new CacheControlHeaderValue
{
Public = true,
MaxAge = TimeSpan.FromSeconds(cacheMaxAgeSeconds)
};
return response;
}
catch (Exception apiEx)
{
//...
}
}
Ответ
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: application/json; charset=utf-8
Date: Thu, 23 Jul 2015 10:53:17 GMT
Server: Microsoft-IIS/7.5
Set-Cookie: ASP.NET_SessionId=knjh4pncbrhad30kjykvwxyz; path=/; HttpOnly
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Content-Length: 2367
Connection: keep-alive
Ответ, взяв это через несколько недель:
Заголовка Cache-Control, по-видимому, установлена на 'private' при запуске отладки. Проблема пропадает, когда я запускаю сборку релизов.
В приведенном ниже коде указано "контроль кеша: public, max-age = 15" правильно в приложении WebApi от Vanilla (System.Web.Http 4.0.0.0). Итак... это, вероятно, не сам WebApi, вызывающий проблему.
У вас может быть какая-то магия в вашем проекте, которая изменяет настройки кеша (думайте о глобальных фильтрах действий или о чем-то подобном). Или, может быть, вы проходите через прокси-сервер, который переписывает заголовки HTTP.
public HttpResponseMessage Get()
{
var content = new JavaScriptSerializer().Serialize(new { foo = "bar" });
var response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent(content, Encoding.UTF8, "application/json")
};
response.Headers.CacheControl = new CacheControlHeaderValue
{
Public = true,
MaxAge = TimeSpan.FromSeconds(15)
};
return response;
}
// returns in the response: "Cache-Control: public, max-age=15"
Чтобы добавить еще одну вещь, которая может вызвать это:
Вы запускаете конвейер Owin.
В этом случае вам нужно установить заголовки в промежуточном программном обеспечении Owin, определенном следующим образом:
class MiddleWare : OwinMiddleware
{
public MiddleWare(OwinMiddleware next)
: base(next)
{
}
public override async Task Invoke(IOwinContext context)
{
context.Response.Headers["Cache-Control"] = "no-cache, no-store, must-revalidate";
context.Response.Headers["Pragma"] = "no-cache";
context.Response.Headers["Expires"] = "0";
await Next.Invoke(context);
}
}