3

私はこれについてしばらく頭を悩ませてきましたが、SOコミュニティにそれを試してもらうことにしました...

クライアント側からの POST に応答して単純なタスクを実行し、JsonResult成功した場合は単純なブール値の「成功」プロパティを持つ匿名クラスからビルドされた を返すアクションがいくつかあります。アクションが失敗した場合はエラーPartialViewResult付きで を返します。ModelState

<HttpPost()> _
Public Function UpdateHeader(ByVal header As XmlReturnHeader) As ActionResult
    If ModelState.IsValid Then
        Dim updated As Integer = TaxRepository.XmlReturnHeader.Update(header)
        If updated = 1 Then
            Return Json(New With {.Success = True}, JsonRequestBehavior.AllowGet)
        End If
    End If
    Return PartialView("Maintenance/Header", header)
End Function

クライアント側のコードも同様に単純です。結果にSuccessプロパティがあるかどうかを確認したいのですが、それが本当にあったことを確認してtrueから、そこから進みます。

$.post('<%= Url.Action("UpdateHeader") %>', $(this).serialize(), function (data) {
    if (data.Success && data.Success === true) {
        $('#list').trigger('reloadGrid');
        $('#edit').dialog('close');
    } else { // result must be the HTML
        $('#edit').html(data);
    }
});

ただし、テストで問題が発生しました。コールバック関数から受け取るオブジェクトは、常に次のdataようになります。

{ success: true }
  ^

sinsuccessは小文字で、JS では大文字と小文字が区別されるため、問題があります。

奇妙な部分は、VB.NET コードを次のように変更した場合です。

Return Json(New With {.Garbage = True}, JsonRequestBehavior.AllowGet),

受け取ります

{ Garbage: true } 

に戻すとNew With { .Success = True }、小文字の が再び表示されますs

テストには IIS と IE9 を使用しています。どういうわけかレスポンスがキャッシュされているような気がします。JsonResultアプリケーションには、匿名パラメーターのプロパティとして小文字の「成功」を使用する場所が他にもあります。おそらく、IIS は以前の GET または POST 要求からの応答をキャッシュしていますか?

[アップデート]

応答キャッシュ理論をテストするために、コードを次のように変更しました。

Return Json(New With {.Success = True, .Random = DateTime.Now.Ticks},
   JsonRequestBehavior.AllowGet)

これにより、クライアント側で正しい応答が受信されました。偉大な。しかし、一体何が起こっていたのですか?POST はキャッシュから除外されていると思いましたか? それとも、リクエストのみで、レスポンスはありませんか?

今後これを回避するにはどうすればよいですか?

[アップデート]

もう 1 つのヒント: jQuery を介してリクエストのキャッシュをグローバルに無効にしていOutputCacheAttributeますが、サーバー側で採用されている s やそのような「キャッシュなし」メカニズムはありません。コントローラー全体をすばやく平手打ち<OutputCache(NoStore:=True, Duration:=0, VaryByParam:="*")>し、JSON からプロパティを削除しました.Randomが、まだ{ success: true }.

アプリケーション プールをリサイクルし、Temporary .NET ファイルを削除し、ブラウザのキャッシュをクリアしましたが、同じ問題が解決しません。

4

1 に答える 1

0

まだご覧になっていない場合は、ASP.net MVC の出力キャッシュに関する次の記事をご覧になることをお勧めします。 mvc/

記事によると、デフォルトの応答ヘッダーには次のものが含まれます。

Cache-Control:private

これは、IEが応答をプライベート キャッシュにキャッシュできることを意味します。この記事では、これらのリクエストのキャッシュを無効にするための 3 つのオプションを提供しています。サーバー上でグローバルに無効にする (クライアントのパフォーマンス上の理由からお勧めしません)、カスタム グローバル アクション フィルターを作成する (結果は同じです)、属性を追加する、の 3 つです。 OutputCache と呼ばれるコントローラー アクション:

<OutputCache(Duration:=0)>

jQuery 設定は同様の機能を実行するはずですが、同じ結果が得られない場合があります。これを試して、動作するかどうかを確認してください。

于 2014-10-03T14:38:53.423 に答える