2011-03-17 7 views
7

estoy preparando para el examen de certificación de Microsoft (70-515), la lectura de libro de Microsoft para este examen, las pruebas de la práctica de pruebas ... uno se pregunta:MVC: ¿Qué método debe ser anulado al resultado de la acción caché

Está creando un filtro de acción MVC personalizado para almacenar en caché los resultados de acción.

¿Qué método virtual debe anular?

respuesta correcta (según el programa de pruebas, que se distribuye con un libro) es "OnResultExecuting"

y explicación de la respuesta:

Cuando se crea un filtro de acción personalizado heredando de la clase ActionFilterAttribute, puede anular cuatro métodos virtuales que se ejecutan en el siguiente orden: OnActionExecuting(), OnActionExecuted(), OnResultExecuting() y OnResultExecuted(). Para el almacenamiento en caché de resultados, desea capturar los resultados finales procesados. Por lo tanto, debe anular el último método para ejecutar: OnResultExecuting().

Aquí hay una incoherencia: si tenemos que anular el último método mencionado, entonces debe ser "OnResultExecuted". Pero en respuesta se dice "OnResultExecuting".

Así que la pregunta es:

  1. ¿Qué es un método correcto para ser anulado?
  2. ¿Qué opción debo elegir en el examen para que la respuesta se considere correcta? (La pregunta es válida para el caso en que "correcta" respuesta es diferente de la sugerida por el sistema.

Gracias.

PS No estoy seguro si la pregunta actual pertenece a SO, pero al menos está bastante cerca

+1

Estaba a punto de publicar la misma pregunta :) – TweeZz

+0

Me parece que hay varias preguntas bastante horribles en el programa de prueba. He tenido la intención de publicar una diatriba sobre eso yo mismo. Esta pregunta ciertamente me sorprendió también. –

Respuesta

6

Después de un tiempo para mí, tiene sentido: debe anular el método 'OnResultExecuting' para comprobar si ya tiene el resultado en caché. Si la respuesta es "sí", la obtendrás de la memoria caché; si no, realmente ejecutarás la función de "ejecutar" la parte y luego la colocarás en la memoria caché.

+0

Ah, vale, eso tiene sentido. Pero, ¿qué pasa con la afirmación en la respuesta del Libro, que OnResultExecuting() es el último en ejecutarse? Aún así, con su enfoque, ¿no sería el último aún ... Ejecutado()? – Marcel

0

la convención dice (en relación con el caso/caso la ejecución de métodos): forma progresiva = antes de ejecutar la acción llamada, y el tiempo pasado = después de que ocurriera lo tanto la respuesta correcta debería de hecho ser OnResultExecuted

Sin embargo, yo.. te aconsejaría que contactes el micrófono rosoft y pida una aclaración.

1

Honestamente, no estoy de acuerdo con ese enfoque. Yo, personalmente, iría con una anulación de OnActionExecuting y OnResultExecuted. No sirve de mucho anular solo OnResultExecuted, ya que ya ha ejecutado el método de acción para cuando se aplicará el filtro. Querrá interceptar la solicitud antes de que se ejecute la acción y devolver la memoria caché de salida en OnActionExecuting, y desearía capturar el resultado final en OnResultExecuted.

3

La mejor manera sería mirar el source for the built in OutputCacheAttribute.Los principales entrañas de la misma es:

public override void OnResultExecuting(ResultExecutingContext filterContext) { 
    if (filterContext == null) { 
     throw new ArgumentNullException("filterContext"); 
    } 

    // we need to call ProcessRequest() since there's no other way to set the Page.Response intrinsic 
    OutputCachedPage page = new OutputCachedPage(_cacheSettings); 
    page.ProcessRequest(HttpContext.Current); 
} 

private sealed class OutputCachedPage : Page { 
    private OutputCacheParameters _cacheSettings; 

    public OutputCachedPage(OutputCacheParameters cacheSettings) { 
     // Tracing requires Page IDs to be unique. 
     ID = Guid.NewGuid().ToString(); 
     _cacheSettings = cacheSettings; 
    } 

    protected override void FrameworkInitialize() { 
     // when you put the <%@ OutputCache %> directive on a page, the generated code calls InitOutputCache() from here 
     base.FrameworkInitialize(); 
     InitOutputCache(_cacheSettings); 
    } 
} 

por lo que han implementado sobreescribiendo OnResultExecuting. Personalmente, no entiendo por qué esperarías tanto tiempo ... porque la mayor parte del tiempo que tarda en procesarse una solicitud sería en el método de acción con todo su servicio, repositorio y todas las llamadas. ¿No?

Quizás alguien mucho más inteligente que yo pueda explicarlo.

+0

Recuerde que este atributo podría aplicarse a una acción que modifique el estado en el servidor, es concebible que alguien devuelva los mismos datos a pesar de que la salida sea la misma. No es raro recopilar información mediante solicitud de anuncios, imágenes y cosas por el estilo. Si evita que se llame a la acción, eso no puede suceder. No quieres hacer eso en el nivel del marco. –

Cuestiones relacionadas