我得到一个间歇性的例外,说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); } }
谢谢,克里斯
我们找到了答案.我们调查了我们的网络日志.它表明我们收到了一些奇怪的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添加授权部分:
我们遇到了类似的问题,但发现它发生的原因是用户在登录超时后发布到控制器.然后系统重定向到登录屏幕.登录后,它会重定向回用户尝试发布的URL,但这次它正在执行GET请求,因此找不到标有[HttpPost]属性的操作.
我在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(); }
我们在应用程序上遇到了同样的问题,我能够将其跟踪到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 })
因此,至少对我们来说,故事的寓意是,如果您看到这些错误,请追踪您认为自己正在发布的网址并确保自己是这样.