1. ホーム
  2. asp.net-mvc

[解決済み] asp.netのmvc例外が断続的に発生します。"パブリックアクションメソッド ABC がコントローラ XYZ で見つかりませんでした。"

2023-03-10 20:57:14

質問

asp.net mvcがアクションメソッドを見つけられないという例外が断続的に発生します。以下がその例外です。

パブリックアクションメソッド 'Fill' が コントローラに見つかりませんでした。 'Schoon.Form.Web.Controllers.ChrisController' に見つかりませんでした。

このアプリケーションはほとんどの場合動作するので、ルーティングは正しく設定されていると思います。以下はコントローラのアクションメソッドです。

[ActionName("Fill")]
[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post), UserIdFilter, DTOFilter]
public ActionResult Fill(int userId, int subscriberId, DisplayMode? mode)
{
     //…
}

ルートです。

routes.MapRoute(
        "SchoonForm",
        "Form/Fill/{subscriberId}",
        new { controller = "ChrisController", action = "Fill" },
        new { subscriberId = @"\d+" }
    );

そして、これがそのスタックです。

System.Web.HttpException: パブリック アクションメソッド 'Fill' が コントローラに見つかりませんでした。 'Schoon.Form.Web.Controllers.ChrisController' に見つかりませんでした。 で で、System.Web.Mvc.Controller.HandleUnknownAction(String actionName) in C:\DevThirdParty⇄Src⇄SystemWebMvc⇄MvcController.cs:line 197 at System.Web.Mvc.Controller.ExecuteCore() in C:\DeviceThirdParty⇄SystemWebMvc⇄MvcController.cs:line 164 at System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) in C:\ThirdParty⇄Src⇄SystemWebMvc⇄MvcControllerBase.cs:line 76 at System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) in C:\DevThirdParty⇄Src⇄SystemWebMvc⇄ControllerBase.cs:line 87 at System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext) in C:\DevThirdParty⇄SrcSystemWebMvc⇄MvcHandler.cs:line 80 at System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext) in C:\DevThirdParty⇄SrcSystemWebMvc⇄MvcHandler.cs:line 68 at System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext) in C:\DevThirdParty⇄Src⇄SystemWebMvc⇄MvcHandler.cs:line 104 at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at で、System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) にて実行。

以下は私のフィルタの例ですが、すべて同じように動作します。

public class UserIdFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        const string Key = "userId";

        if (filterContext.ActionParameters.ContainsKey(Key))
        {
            filterContext.ActionParameters[Key] = // get the user id from session or cookie
        }

        base.OnActionExecuting(filterContext);
    }
}

ありがとうございます。 クリス

どのように解決するのですか?

私たちは答えを見つけました。私たちは Web ログを調べました。OPTIONS、PROPFIND、HEAD などの奇妙な http アクション (動詞/メソッド) を受信していたことがわかりました。

これは、これらの例外のいくつかの原因であると思われます。これで、断続的に発生していた理由がわかりました。

私たちは、curl.exe ツールでこの問題を再現しました。

curl.exe -X OPTIONS http://localhost/v2.3.1.0/(S(boztz1aquhzurevtjwllzr45))/Form/Fill/273
curl.exe -X PROPFIND http://localhost/v2.3.1.0/(S(boztz1aquhzurevtjwllzr45))/Form/Fill/273
curl.exe -X HEAD http://localhost/v2.3.1.0/(S(boztz1aquhzurevtjwllzr45))/Form/Fill/273

私たちが使った修正は、web.configにauthorizationセクションを追加することでした。

<authorization>
  <deny users="*" verbs="OPTIONS, PROPFIND, HEAD"/>
</authorization>