问题描述
我收到一个间歇性异常说,asp.net的MVC无法找到操作方法。这里的异常:
I'm getting an intermittent exception saying that asp.net mvc can’t find the action method. Here’s the exception:
一个公共行动方法补可能
不能在控制器发现
Schoon.Form.Web.Controllers.ChrisController。
我觉得我有路由设置正确,因为这个应用程序的工作的大部分时间。这里是控制器的操作方法。
I think I have the routing set up correctly because this application works most of the time. Here is the controller’s action method.
[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。
在
System.Web.Mvc.Controller.HandleUnknownAction(字符串
actionName)在
C:\\ dev的\\第三方\\ MvcDev的\\ src \\ SystemWebMvc \\的mvc \\ Controller.cs:行
在197
System.Web.Mvc.Controller.ExecuteCore()
在
C:\\ dev的\\第三方\\ MvcDev的\\ src \\ SystemWebMvc \\的mvc \\ Controller.cs:行
在164
System.Web.Mvc.ControllerBase.Execute(RequestContext的
RequestContext的)在
C:\\ dev的\\第三方\\ MvcDev的\\ src \\ SystemWebMvc \\的mvc \\ ControllerBase.cs:行
76
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext的
RequestContext的)在
C:\\ dev的\\第三方\\ MvcDev的\\ src \\ SystemWebMvc \\的mvc \\ ControllerBase.cs:行
在87
System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase
HttpContext的)在
C:\\ dev的\\第三方\\ MvcDev的\\ src \\ SystemWebMvc \\的mvc \\ MvcHandler.cs:行
在80
System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext的
HttpContext的)在
C:\\ dev的\\第三方\\ MvcDev的\\ src \\ SystemWebMvc \\的mvc \\ MvcHandler.cs:行
在68
System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext的
HttpContext的)在
C:\\ dev的\\第三方\\ MvcDev的\\ src \\ SystemWebMvc \\的mvc \\ MvcHandler.cs:行
104
System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
在
System.Web.HttpApplication.ExecuteStep(IExecutionStep
一步,布尔和放大器; completedSynchronously)
下面是我的过滤器的一个例子,他们都以同样的方式:
Here is an example of my filters they all work the same way:
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);
}
}
谢谢,
克里斯
Thanks,Chris
推荐答案
我们找到了答案。我们看着我们的网络日志。它表明,我们正在接受一些奇怪的动作的HTTP(动词/方法),比如OPTIONS,PROPFIND和HEAD。
We found the answer. We looked into our web logs. It showed that we were receiving some weird http actions (verbs/methods) like OPTIONS, PROPFIND and HEAD.
这似乎有些论文异常的原因。这就解释了为什么它是间歇性的。
This seems to the cause of some of theses exceptions. This explains why it was intermittent.
我们与curl.exe工具重现该问题:
We reproduced the issue with the curl.exe tool:
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:
The fix we used was to add an authorization section to web.config:
<authorization>
<deny users="*" verbs="OPTIONS, PROPFIND, HEAD"/>
</authorization>
这篇关于间歇asp.net mvc的例外:“一个公益行动方法ABC无法控制器XYZ被发现。”的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!