间歇性的asp.net mvcexception:“在控制器XYZ上找不到公共行为方法ABC”。

我得到一个间歇性的exception,说asp.net mvc无法find操作方法。 这是一个例外:

在控制器“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”。 System.Web.Mvc.Controller.HandleUnknownAction(String actionName)in C:\ dev \ ThirdParty \ MvcDev \ src \ SystemWebMvc \ Mvc \ Controller.cs:System.Web.Mvc.Controller.ExecuteCore()in C :\ dev \ ThirdParty \ MvcDev \ src \ SystemWebMvc \ Mvc \ Controller.cs:C:\ dev \ ThirdParty \ MvcDev \ src \ SystemWebMvc \ Mvc \ System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) ControllerBase.cs:第76行System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext)在C:\ dev \ ThirdParty \ MvcDev \ src \ SystemWebMvc \ Mvc \ ControllerBase.cs中:第87行System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext)中的System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext)在C:\ dev \ ThirdParty \ MvcDev \ src \ SystemWebMvc \ Mvc \ MvcHandler.cs:在C:\ dev \ ThirdParty \ MvcDev \ src \ SystemWebMvc \ Mvc \ MvcHandler.cs:第68行System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext)在C:\ dev \ ThirdParty \ MvcDev的\ src \ SystemWebMvc \了Mv c \ MvcHandler.cs:System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean&completedSynchronously)

这里是我的filter的一个例子,他们都以同样的方式工作:

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

谢谢,克里斯

我们find了答案。 我们查看了我们的networking日志。 它显示我们正在接收一些奇怪的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中:

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

我们遇到类似的问题,但是发现这是因为用户在login超时后发布给控制器。 系统然后redirect到login屏幕。 login后redirect到用户试图发送到的URL,但是这次它正在做一个GET请求,因此没有find标有[HttpPost]属性的动作。

我在asp.net mvc中遇到了同样的问题。 这个错误 – 404没有find。 我这样解决问题 – 把这个代码放在MyAppControllerBase (MVC)

  protected override void HandleUnknownAction(string actionName) { this.InvokeHttp404(HttpContext); } public ActionResult InvokeHttp404(HttpContextBase httpContext) { IController errorController = ObjectFactory.GetInstance<PagesController>(); 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(); } 

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

首先我们定义了这个链接:

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

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

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

这是我们的MVC行动,有一个HttpPostfilter:

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

我们发现,大部分时间这个工作很好。 然而,在一些缓慢的页面加载(或者真正的快速用户)上,用户点击了jquery $(document).ready()事件触发前的链接,这意味着他们试图GET / Controller / SomeAction / XX而不是张贴。

我们不希望用户获得该url,因此删除filter不是我们的select。 相反,我们只是直接连接动作链接的onclick事件(我们不得不稍微改变SomePostEventHandler()来使其工作):

 string clickEvent = "return SomePostEventHandler(this);"; Html.ActionLink("Click Me", "SomeAction", new { id = Model.Id}, new { onclick = clickEvent }) 

因此,对于我们来说,至less对于我们来说,道德是如果你看到这些错误,追踪你认为你正在发布的URL,并确保你是。

我也有这个问题。

在我的情况下,它涉及到对请求的动作的动词限制,其中视图是一个POST但是只在受支持的GETHEAD请求局部视图。 将POST动词添加到AcceptVerbsAttribute (在MVC 1.0中)解决了这个问题。

我有类似的问题与QQfile upload

当后动作是/Document/Save我得到的exception控制器'Project.Controllers.DocumentController'找不到公共行动方法'保存'。

但是,如果post操作是/Document/Save/ ,那么post是正确的,并工作!

上帝保存/

从IIS日志中,我们的问题是由Googlebot尝试POST和GET为一个POST专用控制器操作引起的。

对于这种情况,我build议处理404像德米特里build议。

不应该是

 routes.MapRoute( "SchoonForm", "Form/Fill/{subscriberId}", new { controller = "Chris", action = "Fill" }, 

另外,你的filter做什么? 他们不能隐藏行动,像ActionMethodSelectorAttribute?

我的根本原因与评论中提到的相似。

我点击一个button,就是ajaxSubmitting提交表单。 其中一个表单域是Datetypes。 但是,由于客户机和服务器机器之间的date格式不同,因此它没有在控制器中执行POST方法。 服务器发回一个302响应,然后再次发送一个GET请求给同一个方法。

但是,控制器中的操作是用HttpPost属性装饰的,因此它找不到方法并发回404响应。

我只是修复了代码,使date格式不匹配不会导致错误,并解决了问题。

删除[HttpGet]属性,它将工作:)

目前接受的答案按预期工作,但不是该function的主要用例。 而是使用ASP.NET定义的function。 在我的情况下,我拒绝了一切,但GET和POST:

  <system.webServer> <security> <requestFiltering> <verbs allowUnlisted="false"> <add verb="GET" allowed="true"/> <add verb="POST" allowed="true"/> </verbs> </requestFiltering> </security> </system.webServer> 

通过上面的代码片断,MVC将正确返回一个404

对于任何有这个问题的人来说,MVC和{{imagepath}}types在图像的src属性中插入,例如:

“公共行动方法”{{imagepath}} previous.png'在控制器上找不到“

解决方法是使用ng-src而不是src。

希望这可以帮助别人:)