间歇性的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
但是只在受支持的GET
和HEAD
请求局部视图。 将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
提交表单。 其中一个表单域是Date
types。 但是,由于客户机和服务器机器之间的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。
希望这可以帮助别人:)