Como limpar programaticamente o outputcache para o método de ação do controlador

Se a ação do controlador tiver o atributo OutputCache especificado em uma ação, existe alguma maneira de limpar o cache de saída sem precisar reiniciar o IIS?

[OutputCache (Duration=3600,VaryByParam="param1;param2")] public string AjaxHtmlOutputMethod(string param1, string param2) { var someModel = SomeModel.Find( param1, param2 ); //set up ViewData ... return RenderToString( "ViewName", someModel ); } 

Eu estou olhando para usar HttpResponse.RemoveOutputCacheItem(string path) para limpá-lo, mas estou tendo problemas para descobrir o que o caminho deve ser para mapeá-lo para o método de ação. Eu vou tentar novamente com a página aspx que é processada por ViewName.

Possivelmente, apenas inserirei manualmente a saída de RenderToString no HttpContext.Cache se não conseguir descobrir isso.

Atualizar

Por favor, note que o OutputCache é VaryByParam, e testar um caminho embutido no código “/ controller / action” não limpa o outputcache, então parece que ele tem que combinar com “/ controller / action / param1 / param2”.

Isso significa que provavelmente terei que reverter para o cache de nível de object e armazenar manualmente em cache a saída para RenderToString() 🙁

   

Tente isso

 var urlToRemove = Url.Action("AjaxHtmlOutputMethod", "Controller"); HttpResponse.RemoveOutputCacheItem(urlToRemove); 

ATUALIZADA:

 var requestContext = new System.Web.Routing.RequestContext( new HttpContextWrapper(System.Web.HttpContext.Current), new System.Web.Routing.RouteData()); var Url = new UrlHelper(requestContext); 

ATUALIZADA:

Tente isto:

 [OutputCache(Location= System.Web.UI.OutputCacheLocation.Server, Duration=3600,VaryByParam="param1;param2")] 

Caso contrário, a exclusão do cache não funcionará porque você armazenou em cache a saída HTML na máquina do usuário

Além da resposta aceita, para suportar os parâmetros VaryByParam:

  [OutputCache (Duration=3600, VaryByParam="param1;param2", Location = OutputCacheLocation.Server)] public string AjaxHtmlOutputMethod(string param1, string param2) { object routeValues = new { param1 = param1, param2 = param2 }; string url = Url.Action("AjaxHtmlOutputMethod", "Controller", routeValues); Response.RemoveOutputCacheItem(url); } 

No entanto, a resposta da Egor é muito melhor, porque suporta todos os valores de OutputCacheLocation:

  [OutputCache (Duration=3600, VaryByParam="param1;param2")] public string AjaxHtmlOutputMethod(string param1, string param2) { if (error) { Response.Cache.SetNoStore(); Response.Cache.SetNoServerCaching(); } } 

Quando SetNoStore () e SetNoServerCaching () são chamados, eles impedem que o Pedido atual seja armazenado em cache. Outras solicitações serão armazenadas em cache, a menos que as funções também sejam chamadas para essas solicitações.

Isso é ideal para lidar com situações de erro – quando normalmente você deseja armazenar respostas em cache, mas não se elas contiverem mensagens de erro.

Eu acho que o stream correto é:

 filterContext.HttpContext.Response.Cache.SetNoStore() 

Outra opção é usar o VaryByCustom para o OutputCache e lidar com a invalidação de certos elementos do cache.

Talvez funcione para você, mas não é uma solução geral para o seu problema

Adicionar código ao AjaxHtmlOutputMethod

 HttpContext.Cache.Insert("Page", 1); Response.AddCacheItemDependency("Page"); 

Para limpar o cache de saída, agora você pode usar

 HttpContext.Cache.Remove("Page");