当前位置:  开发笔记 > 编程语言 > 正文

间歇性的asp.net mvc异常:"在控制器XYZ上找不到公共操作方法ABC."

如何解决《间歇性的asp.netmvc异常:"在控制器XYZ上找不到公共操作方法ABC."》经验,为你挑选了4个好方法。

我得到一个间歇性的例外,说asp.net mvc找不到动作方法.这是例外:

在控制器'Schoon.Form.Web.Controllers.ChrisController'上找不到公共操作方法'Fill'.

我认为我已正确设置路由,因为此应用程序大部分时间都可以正常工作.这是控制器的动作方法.

[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:在控制器'Schoon.Form.Web.Controllers.ChrisController'上找不到公共操作方法'Fill'.在C:\ dev\ThirdParty\MvcDev\src\SystemWebMvc\Mvc\Controller.cs中的System.Web.Mvc.Controller.HandleUnknownAction(String actionName):C中的System.Web.Mvc.Controller.ExecuteCore()中的第197行:\ dev\ThirdParty\MvcDev\src\SystemWebMvc\Mvc\Controller.cs:C:\ dev\ThirdParty\MvcDev\src\SystemWebMvc\Mvc \中System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext)的第164行ControllerBase.cs:C:\ dev\ThirdParty\MvcDev\src\SystemWebMvc\Mvc\ControllerBase.cs:第87行中System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext)的第76行在C:\ dev\ThirdParty\MvcDev\src\SystemWebMvc\Mvc\MvcHandler.cs中的System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext):System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext)中的第80行在C:\ dev\ThirdParty\MvcDev\src\SystemWebMvc\Mvc\MvcHandler.cs:第68行,位于C:\ dev\ThirdParty \中的System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext) MvcDev的\ src\SystemWebMvc \了Mv c\MvcHandler.cs:System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean&completedSynchronously)上的System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()中的第104行

以下是我的过滤器示例,它们的工作方式相同:

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);
    }
}

谢谢,克里斯



1> Chris Schoon..:

我们找到了答案.我们调查了我们的网络日志.它表明我们收到了一些奇怪的http动作(动词/方法),如OPTIONS,PROPFIND和HEAD.

这似乎是一些例外的原因.这解释了为什么它是断断续续的.

我们使用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添加授权部分:


  


我们还发现机器人有时会抓取您的网站 - 甚至是javascript - 来查找链接.然后,他们尝试使用错误的HTTP谓词向这些URI发送请求.例如,如果你有一个jQuery调用某些动作 - 例如/ some-action并且这个方法需要一个POST,机器人可能会尝试发送一个GET,这将导致出现此错误.您的网络日志肯定有助于确认是否是这种情况.我们甚至看到googlebot这样做了.

2> Johann Stryd..:

我们遇到了类似的问题,但发现它发生的原因是用户在登录超时后发布到控制器.然后系统重定向到登录屏幕.登录后,它会重定向回用户尝试发布的URL,但这次它正在执行GET请求,因此找不到标有[HttpPost]属性的操作.



3> Dmitriy..:

我在asp.net mvc中遇到了同样的问题.此错误 - 404未找到.我这样解决问题 - 将此代码放入MyAppControllerBase(MVC)

    protected override void HandleUnknownAction(string actionName)
    {
        this.InvokeHttp404(HttpContext);
    }

    public ActionResult InvokeHttp404(HttpContextBase httpContext)
    {
        IController errorController = ObjectFactory.GetInstance();
        var errorRoute = new RouteData();
        errorRoute.Values.Add("controller", "Pages");
        errorRoute.Values.Add("action", "Http404");
        errorRoute.Values.Add("url", httpContext.Request.Url.OriginalString);
        errorController.Execute(new RequestContext(
             httpContext, errorRoute));

        return new EmptyResult();
    }



4> jslatts..:

我们在应用程序上遇到了同样的问题,我能够将其跟踪到javascript/jquery问题.我们在使用Html.ActionLink()定义的应用程序中有链接,这些链接稍后被jquery覆盖到POST中.

首先我们定义了链接:

Html.ActionLink("Click Me", "SomeAction", new { id = Model.Id})

稍后我们使用SomePostEventHandler函数覆盖默认操作:

 $(document).ready(function() {
      $('#MyLink').click(SomePostEventHandler);
 }

这是我们的MVC动作,它有一个HttpPost过滤器:

 [HttpPost]
 public ActionResult SomeAction(int id)
 {
      //Stuff
 }

我们发现,大部分时间这都很有效.但是,在一些慢速页面加载(或真正快速的用户)上,用户在jquery $(document).ready()事件被触发之前单击该链接,这意味着他们正在尝试GET/Controller/SomeAction/XX而不是张贴.

我们不希望用户获取该URL,因此删除过滤器不是我们的选择.相反,我们直接连接了动作链接的onclick事件(我们必须稍微更改SomePostEventHandler()才能使其工作):

string clickEvent = "return SomePostEventHandler(this);";

Html.ActionLink("Click Me", "SomeAction", new { id = Model.Id}, new { onclick = clickEvent })

因此,至少对我们来说,故事的寓意是,如果您看到这些错误,请追踪您认为自己正在发布的网址并确保自己是这样.

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有