Ответ 1
Я столкнулся с одним и тем же набором проблем и нашел решение проблемы 2 (отключить кеширование, независимо от настроек по умолчанию).
// This forces the server to not provide any caching by refreshing its cache table immediately (0 sec)
[HttpCacheRefreshPolicy(0)]
// This forces the client (browser) to not cache any data returned from the server (even if ETag is present) by setting the time-out to 0 and no-cache to true.
[HttpCacheControlPolicy(true, 0, true)]
public void MyController : ApiControler {... }
Атрибуты должны применяться вместе, чтобы это работало. Вы также можете контролировать кеширование на уровне действия, предоставляя одинаковые правила для каждого действия.
Мне еще нужно выяснить решение проблемы 1. но посмотрите это пространство для обновлений.
Обновление Я нашел решение проблемы 1.
- Зарегистрируйте CachingHandler с помощью контейнера IoC (в моем случае это
IUnityContainer
) - Внедрение ICachingHandler в ваш контроллер веб-API.
- Чтобы недействить ресурс, используйте
ICachingHandler.InvalidateResource(HttpRequestMessage)
См. пример кода ниже. Решение было протестировано.
pubic class Bootstrapper
{
//...
// Create a new caching handler and register it with the container.
public void RegisterCache(HttpConfiguration config, IUnityContainer container)
{
var cachingHandler = new CachingHandler(config);
// ...
container.RegisterInstance<ICachingHandler>(cachingHandler);
}
}
public class ResourceContoller : ApiController
{
private ICachingHandler _cachingHandler;
public ResourceContoller(ICachingHandler cachingHandler)
{
_cachingHandler = cachingHandler;
}
[HttpPost]
public void DeleteResource(int resourceId)
{
// Do the delete
// ...
// Now invalidate the related resource cache entry
// Construct a http request message to the related resource
// HINT: The "DefaultApi" may not be your api route name, so change this to match your route.
// GOTCHA: The route matching mechanism is case sensitive, so be aware!
var relatedResource = new HttpRequestMessage(HttpMethod.Get, Url.Link("DefaultApi", new {controller = "linkedresource", action = "getlinkedresource", id: resourceId}));
// Invalidate the resource with the caching handler.
_cachingHandler.InvalidateResource(relatedResource);
}
}