4

MVC3 アプリケーションで奇妙な動作が見られます。Ajax によって呼び出される Action があり、HTML テキストを含む Post を受け取ります。HTMLの入力を許可したいので、ValidateInput(false)属性を設定します。また、このパラメーターを使用したグローバルな OutputCache フィルターもあります: (NoStore = true, Duration = 0, VaryByParam = "*" )
コードは次のようになります。

[HttpPost]
[ValidateInput(false)]
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*" )]
public ActionResult Edit(SomeModel someModel)
{
   saveModel(someModel);
   return new AjaxEditSuccessResult();
}

そのメソッドに投稿を送信すると、それが実行され、モデルが保存されますが、取得する応答は、標準の「潜在的に危険な Request.Form 値がクライアントから検出されました」というエラー メッセージで、次のスタック トレースが含まれます。

[HttpRequestValidationException (0x80004005): A potentially dangerous Request.Form value was detected from the client (text="<p class="MsoNormal"...").]
System.Web.HttpRequest.ValidateString(String value, String collectionKey, RequestValidationSource requestCollection) +9665149
System.Web.<>c__DisplayClass5.<ValidateHttpValueCollection>b__3(String key, String value) +18
System.Web.HttpValueCollection.EnsureKeyValidated(String key) +9664565
System.Web.HttpValueCollection.Get(String name) +17
System.Web.Caching.OutputCacheModule.CreateOutputCachedItemKey(String path, HttpVerb verb, HttpContext context, CachedVary cachedVary) +676
System.Web.Caching.OutputCacheModule.CreateOutputCachedItemKey(HttpContext context, CachedVary cachedVary) +55
System.Web.Caching.OutputCacheModule.OnLeave(Object source, EventArgs eventArgs) +9716788
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +136
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +69

ValidateInput属性を尊重する必要があることをOutputCache属性に何らかの方法で示すことができるかどうか知っていますか?

4

1 に答える 1

14

検証が呼び出されるフロー内の 2 つの場所があります。

  1. コントローラーメソッドの呼び出し時
  2. レンダリングされた結果がキャッシュに保存されるとき。

の最初の問題を修正しましValidateInputAttribute(false)たが、キャッシュモジュールがディレクティブを無視しているように見えますがNoStore、それでもキャッシュキーを構築しようとし、それを行う前に引数を検証して、その指定を取り除きます: Location = System.Web.UI.OutputCacheLocation.None、キャッシュモジュールはしようとさえしません何でもする。OutputCache[...]を次のように置き換えます。

[OutputCache(NoStore = true, Location = System.Web.UI.OutputCacheLocation.None)]
于 2013-05-30T15:06:21.330 に答える