2

簡単な質問: MVC3 Web アプリケーションでサファリによってエラーが発生するのはなぜですか? Request.Form が何らかの理由で空白になっているのはなぜですか?

詳細な質問: 私の MVC3 Web サイトは、キャッチされない例外があるたびにメールを送信します。これらを使用して、バグをすばやく見つけて修正します。電子メールには、例外、スタック トレース、ユーザーの IP アドレス、ユーザー エージェント文字列、および投稿された可能性のあるフォーム値が含まれています。

最近、追跡が困難であることが判明したエラーに気付きました。他の人の助けになることを願って、ここに調査結果を投稿しようと思いました。

元の症状は次のエラーでした: System.Web.Mvc.HttpAntiForgeryException: 必要な偽造防止トークンが提供されなかったか、無効でした。

私のフォームのアクションはエラーをスローしていました.__RequestVerificationToken隠しフィールドや他のフォームフィールドを持たない状態にページを取得した方法を理解できませんでした.

そのため、Cookie とトークンの仕組みを調べるのに何年も費やし、最終的に ActionResult の [ValidateAntiForgeryToken] 属性を削除して、それがどのように行われたかを確認しましたが、それでもエラーが発生しました。

その後、useragent 文字列が、問題を引き起こしているのは Safari 5.1.7 のみであることを示していることに気付きました。

4

2 に答える 2

2

簡単な回答: [HttpPost] 属性を追加することを忘れないでください!!!

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult PageSubmit() {

長い回答: Safari には、アクセスした "トップ サイト" をウォール スタイルの画面に表示する機能があります。私のサイトには複数のページがありましたが、それらはすべて同じフォーム アクションに送信されます。これにより、フォーム アクションは「非常に人気」になり、トップ サイトに表示されます。

人々は、フォーム変数なしで私の処理ページに直接 GET を行っていたサイトをクリックすることができ、エラーが発生します。

[HttpPost] 属性を追加したので、クリックすると 404 になります。

プレビュー機能に関する追加情報は次のとおりです。Safari Top Sites Previewサーバー変数を確認できるようです。

Request.ServerVariables["HTTP_X_PURPOSE"] == "preview"

あなたもできるJavaScriptチェックがあります:

window.navigator&&window.navigator.loadPurpose==="preview"

これで誰かの時間を節約できることを願っています。

于 2013-02-22T05:22:05.753 に答える