次のように、[HttpGet] を使用するパブリック ASP.NET MVC アクションがあります。
[HttpGet]
public ActionResult List(OrganizationFilterModel p_model) {
...
}
ユーザーが有効なユーザー セッションなしでページを要求すると、ログイン ページにリダイレクトされます。ログイン システムは、ログイン後に最初に要求された URL にリダイレクトします。
このページでは、特定の状況下で、ログイン システムから元の URL へのリダイレクトにより、例外がスローされます。
コントローラ "MyApp.Controllers.OrganizationController" でパブリック アクション メソッド "List" が見つかりませんでした。ただし、単にページを再リクエストすると、その後のすべてのリクエストで正常に表示されます。
条件とその他の注意事項:
- ユーザーは有効な FormsAuth チケットを持っています。[意味、彼らは最近ログインしました]
- 期限切れまたは AppDomain のリセットにより、ユーザーのセッションが失われました。
- 削除
[HttpGet]
すると問題が解決します。[失敗したリクエストはGETでしたが]
これらの条件下では、[HttpGet]
フィルターが存在すると、MVC がアクションを見つけることができなくなりますが、最初の要求でのみ発生します。後続のすべてのリクエストは正常に機能します。
Fiddler は次のパターンを示します。
- /Organization/List に GET -->ログイン ページに 302 を返す
- /アカウント/ログインのGET
- /Account/Login への POST [ユーザーがログインし、リダイレクトされる]
- /Organization/List の GET -->エラーがスローされる
- /Organization/List の GET -->リクエストを繰り返すと正常に動作します
概要:フィルターがアクションの検索を妨げていますが、これは最初の要求でのみであり、GET 要求[HttpGet]
であるにもかかわらずです。
どうしたの?
更新: 追加情報を追加するには:
- MVC 4 の使用
[Authorize]
FormsAuth を使用しますが、属性は使用しません。OnActionExecuting
リクエストが認証されたが、有効なセッションがない場合にログインを強制するカスタム コードがあります。(実際には、いくつかの静的な便利なメソッドと構成設定に FormsAuth を使用しています)- FormsAuth がログイン ページへのリダイレクトを引き起こす場合、この問題は発生しません。この問題は、カスタム コードによってリダイレクトが発生した場合に発生します。
- FormsAuth を完全に削除すると、問題も修正されます。
FormsAuth を削除すると問題が解決するので、しばらくやりたかったので、トラブルシューティングを中止します。これが FormsAuth + MVC [または FormsAuth + Routing] の欠陥なのか、それとも私が愚かなことをしたのか知りたいです。