存在しないコントローラーの例外がスローされないようにします
-
30-09-2019 - |
質問
わかりました、だから私はこの問題に困惑しています。私はこの問題を解決することになっている多くのことを見てきましたが、私は自分の要件を満たすことができる解決策を得ていません。
Elmahを使用して例外を記録し、無効なコントローラーまたは適切なコントローラーと無効なアクションを備えたURLのいずれかがこの例外を取得しています。
System.Web.HttpException: The controller for path '/BadController' was not found or does not implement IController.
at System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType)
at System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName)
at System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory)
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state)
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state)
at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
この例外がスローされないようにしたいです。カスタムエラーを使用していますが、アプリケーションがカスタム404エラーページに送信されるため、正常に動作します。ただし、例外はまだ記録されます。
私が持っています [HandleError]
すべてのコントローラーを飾る属性。これは可能ですか?もしそうなら、私はどんな助けにも感謝します。
設定してみました リダイレクトする最終ルート, 、しかし、それは何らかの理由でそれより前のルートと一致しています。私はaを使用しようとしました httpmodule, 、およびのクリア Application_Error
のイベント Global.asax
ファイル。その例外を止めるものはありません。
助けてくれてありがとう!
解決 3
この例外を掘り下げた後、おそらく私の問題を適切に中継していなかったでしょう。答えは、これらの例外をエルマから除外することです。 記事.
デフォルトでは、Elmahは、404やその他のHTTPエラーを含むすべての未処理の例外の詳細を記録します。エラーフィルタリングを使用して、これらまたは他のタイプのエラーを無視するようにElmahに指示できます。
他のヒント
RouteConstraintを作成します。これは、コントローラーが存在するかどうかをチェックし(実際、すべての可能なコントローラーを開始してスキャンし、キャッシュ、つまり意味があることを知っています)。標準ルートに追加します。
したがって、悪いコントローラーへのリクエストがある場合、通常のルートでは受け入れられません。しかし、その後、キャッチオール - > 404ルートに受け入れられます...
要求されたコントローラーを見つけられないときに目的の機能を実行できるカスタムコントローラーファクトリを配線します。それはほんの数行のコードであり、あまりにも痛みを伴うものはありません。
独自のコントローラー工場をロールするか、多くのライブラリのいずれかを出発点として使用できます。 IcontrollerFactoryを実装するクラスがあり、CreateController()関数内にカスタムロジックが表示されます。
私が使う DSOはitcloud contribです. 。そのどれも {controller}/{action}
一般的なパラメーター。明示的 UrlRoute
各アクションメソッドの属性。メソッドの真上のパラメーターの制約を見るのが好きです。