2011-03-17 75 views
7

我準備給微軟認證考試(70-515),閱讀微軟的書這門考試,練習測試......一個測試問:MVC:哪種方法應該重寫緩存作用的結果

您正在創建自定義MVC操作篩選器以緩存操作結果。

你應該覆蓋哪個虛擬方法?

正確答案(根據測試程序,被分發一本書)是「OnResultExecuting」

和解釋的答案:

當您創建通過繼承自定義操作過濾器從ActionFilterAttribute類中,您可以覆蓋按以下順序運行的四個虛擬方法:OnActionExecuting(),OnActionExecuted(),OnResultExecuting()和OnResultExecuted()。對於輸出緩存,您想要捕獲最終的渲染結果。因此,您應該覆蓋最後一個要運行的方法:OnResultExecuting()。

這裏是不一致的:如果我們需要重寫最後提到的方法,那麼它應該是「OnResultExecuted」。但在回答時,它被告知「OnResultExecuting」。

所以,問題是:

  1. 什麼是要覆蓋一個正確的方法?
  2. 我應該在考試中選擇哪個選項才能將答案視爲正確? (問題是有效的情況下,當「正確」的答案其實是不同的系統提示。

感謝。

PS我不知道,如果目前的問題屬於SO,但至少是非常接近

+1

我正要發佈相同的問題:) – TweeZz 2011-06-27 14:14:58

+0

在我看來,在測試程序中有幾個非常糟糕的問題。我一直有意在我自己的某個地方發表咆哮聲。這個問題當然也讓我感到失望。 – 2011-07-14 09:14:55

回答

6

經過一段時間對我來說,這是有道理的:你應該重寫'OnResultExecuting'方法,以檢查你是否已經結果緩存。如果「是」,您只需從緩存中獲取它,如果不是,您將真正執行「執行」部分的功能,然後將其放入緩存。

+0

啊,好吧,這是有道理的。但是,在書的答案中,OnResultExecuting()是最後一個執行的語句呢?即使如此,用你的方法,是不是最後一個仍然......被執行()? – Marcel 2014-05-07 20:33:24

0

的約定說,(關於事件/事件執行方法):漸進形式=執行指定的動作之前,和過去式=事發後因此正確答案應該確實是OnResultExecuted

不過,我。會建議你聯繫話筒rosoft並要求澄清。

1

老實說,我不同意這種做法。我個人而言,會自行重寫OnActionExecuting和OnResultExecuted。由於您在應用過濾器時已經執行了操作方法,因此它只會覆蓋OnResultExecuted並沒有太大作用。您希望在執行操作之前攔截請求,並在OnActionExecuting中返回輸出緩存,並且您想要在OnResultExecuted中捕獲最終結果。

3

最好的方法是看看source for the built in OutputCacheAttribute。它的主要膽量是:

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); 
    } 
} 

因此,他們通過重寫OnResultExecuting付諸實施。我個人不明白你爲什麼要等那麼久......因爲處理請求所花費的大部分時間將在操作方法中包含所有服務,存儲庫和任何調用?沒有?

也許有人比我更聰明可以解釋。

+0

請記住,此屬性可以應用於修改服務器上的狀態的操作,可以想象有人會返回相同的數據,儘管輸出是相同的。通過獲取廣告,圖片和類似事情的請求來收集信息並非聞所未聞。如果你阻止這個動作被調用,那就不會發生。你不想在框架級別這樣做。 – 2011-04-02 01:58:23

相關問題