asp.net - parameter - crud mvc c#
Cómo borrar programáticamente el caché de salida para el método de acción del controlador (5)
Si la acción del controlador tiene el atributo OutputCache especificado en una acción, ¿hay alguna manera de borrar el caché de salida sin tener que reiniciar 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 );
}
Estoy buscando usar HttpResponse.RemoveOutputCacheItem(string path)
para borrarlo, pero estoy teniendo problemas para averiguar cuál debería ser la ruta para asignarlo al método de acción. Voy a intentarlo de nuevo con la página aspx que es renderizada por ViewName.
Posiblemente inserte manualmente la salida de RenderToString
en HttpContext.Cache
si no puedo resolver esto.
Actualizar
Tenga en cuenta que OutputCache es VaryByParam, y probar una ruta codificada "/ controller / action" no elimina el caché de salida, por lo que parece que tiene que coincidir con "/ controller / action / param1 / param2".
Eso significa que probablemente tendré que volver al almacenamiento en caché de nivel de objeto y almacenar en caché manualmente la salida para RenderToString()
:(
Además de la respuesta aceptada, para admitir los parámetros de 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);
}
Sin embargo, la respuesta de Egor es mucho mejor, ya que admite todos los valores de OutputCacheLocation:
[OutputCache (Duration=3600, VaryByParam="param1;param2")]
public string AjaxHtmlOutputMethod(string param1, string param2)
{
if (error)
{
Response.Cache.SetNoStore();
Response.Cache.SetNoServerCaching();
}
}
Cuando se SetNoStore() y SetNoServerCaching() , impiden que la Solicitud actual se SetNoServerCaching() caché. Las solicitudes adicionales se almacenarán en caché, a menos que las funciones también se soliciten para esas solicitudes.
Esto es ideal para manejar situaciones de error, cuando normalmente desea almacenar respuestas en caché, pero no si contienen mensajes de error.
Agregar código a AjaxHtmlOutputMethod
HttpContext.Cache.Insert("Page", 1);
Response.AddCacheItemDependency("Page");
Para borrar el caché de salida, ahora puede usar
HttpContext.Cache.Remove("Page");
Creo que el flujo correcto es:
filterContext.HttpContext.Response.Cache.SetNoStore()
Otra opción es usar VaryByCustom
para OutputCache y manejar la invalidación de ciertos elementos de caché allí.
Tal vez funcione para usted, pero no es una solución general a su problema
Prueba esto
var urlToRemove = Url.Action("AjaxHtmlOutputMethod", "Controller");
HttpResponse.RemoveOutputCacheItem(urlToRemove);
ACTUALIZADO:
var requestContext = new System.Web.Routing.RequestContext(
new HttpContextWrapper(System.Web.HttpContext.Current),
new System.Web.Routing.RouteData());
var Url = new UrlHelper(requestContext);
ACTUALIZADO:
Prueba esto:
[OutputCache(Location= System.Web.UI.OutputCacheLocation.Server, Duration=3600,VaryByParam="param1;param2")]
De lo contrario, la eliminación de la caché no funcionará porque ha almacenado en caché la salida HTML en la máquina del usuario