try page net mvc handling example error customerrors custom create catch asp asp.net-mvc exception

asp.net-mvc - page - onexception mvc



Excepción intermitente de asp.net mvc: "No se pudo encontrar un método de acción pública ABC en el controlador XYZ". (12)

Acabamos de tener el mismo problema en nuestra aplicación y pude rastrearlo a un problema de javascript / jquery. Tenemos enlaces en nuestra aplicación definidos usando Html.ActionLink () que luego serán reemplazados en POST por jquery.

Primero, hemos definido el enlace:

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

Más tarde anulamos la acción predeterminada con nuestra función SomePostEventHandler:

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

Esto estaba afectando nuestra acción MVC que tenía un filtro HttpPost:

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

Lo que encontramos es que la mayoría de las veces esto funcionó muy bien. Sin embargo, en algunas cargas de página lentas (o usuarios realmente rápidos), el usuario hacía clic en el enlace antes de que el evento jquery $ (document) .ready () se activara, lo que significa que intentaban OBTENER / Controlador / SomeAction / XX en lugar de destino.

No queremos que el usuario OBTENGA esa url, por lo que eliminar el filtro no es una opción para nosotros. En su lugar, simplemente conectamos el evento onclick del enlace de acción directamente (tuvimos que cambiar SomePostEventHandler () ligeramente para que esto funcione):

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

Por lo tanto, la moraleja de la historia, al menos para nosotros, es que si está viendo estos errores, busque la URL en la que PIENSA que está PUBTANDO y asegúrese de estarlo.

Recibo una excepción intermitente que dice que asp.net mvc no puede encontrar el método de acción. Aquí está la excepción:

No se pudo encontrar un método de acción pública ''Rellenar'' en el controlador ''Schoon.Form.Web.Controllers.ChrisController''.

Creo que tengo la ruta configurada correctamente porque esta aplicación funciona la mayor parte del tiempo. Aquí está el método de acción del controlador.

[ActionName("Fill")] [AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post), UserIdFilter, DTOFilter] public ActionResult Fill(int userId, int subscriberId, DisplayMode? mode) { //… }

La ruta:

routes.MapRoute( "SchoonForm", "Form/Fill/{subscriberId}", new { controller = "ChrisController", action = "Fill" }, new { subscriberId = @"/d+" } );

Y aquí está la pila:

System.Web.HttpException: no se pudo encontrar un método de acción pública ''Fill'' en el controlador ''Schoon.Form.Web.Controllers.ChrisController''. en System.Web.Mvc.Controller.HandleUnknownAction (String actionName) en C: / dev / ThirdParty / MvcDev / src / SystemWebMvc / Mvc / Controller.cs: línea 197 en System.Web.Mvc.Controller.ExecuteCore () en C : / dev / ThirdParty / MvcDev / src / SystemWebMvc / Mvc / Controller.cs: línea 164 en System.Web.Mvc.ControllerBase.Execute (RequestContext requestContext) en C: / dev / ThirdParty / MvcDev / src / SystemWebMvc / Mvc / ControllerBase.cs: línea 76 en System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute (RequestContext requestContext) en C: / dev / ThirdParty / MvcDev / src / SystemWebMvc / Mvc / ControllerBase.cs: línea 87 en System.Web.Mvc.MvcHandler.ProcessRequest (HttpContextBase httpContext) en C: / dev / ThirdParty / MvcDev / src / SystemWebMvc / Mvc / MvcHandler.cs: línea 80 en System.Web.Mvc.MvcHandler.ProcessRequest (HttpContext httpContext) en C: / dev / ThirdParty / MvcDev / src / SystemWebMvc / Mvc / MvcHandler.cs: línea 68 en System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest (HttpContext httpContext) en C: / dev / ThirdParty / MvcDev / src / SystemWebMvc / Mv c / MvcHandler.cs: línea 104 en System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () en System.Web.HttpApplication.ExecuteStep (paso IExecutionStep, Boolean & completedSynchronously)

Aquí hay un ejemplo de mis filtros, todos funcionan de la misma manera:

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

Gracias, Chris


Desde los registros de IIS, nuestro problema fue causado por el robot de Google que intentaba POST y un GET por una acción de controlador solo de POST.

Para este caso, recomiendo manejar el 404 como la sugerencia de Dmitriy.


Elimina los atributos [HttpGet] y funcionará :)


Encontramos la respuesta. Revisamos nuestros registros web. Demostró que recibíamos algunas acciones http (verbos / métodos) raros como OPTIONS, PROPFIND y HEAD.

Esto parece ser la causa de algunas de estas excepciones. Esto explica por qué fue intermitente.

Reproducimos el problema con la herramienta 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

La solución que utilizamos fue agregar una sección de autorización a web.config:

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


La respuesta actualmente aceptada funciona como se esperaba, pero no es el caso de uso principal para la característica. En su lugar, use la característica definida por ASP.NET. En mi caso, denegué todo excepto GET y POST:

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

Con el fragmento de código anterior, MVC devolverá correctamente un 404


Mi causa raíz fue similar a la mencionada en el comentario.

Estaba ajaxSubmitting un formulario con solo presionar un botón. Uno de los campos de formulario era de tipo Date . Sin embargo, debido a la diferencia en los formatos de fecha entre el cliente y la máquina servidor, no ejecutó el método POST en el controlador. El servidor devolvió una respuesta 302 y luego envió una solicitud GET para el mismo método nuevamente.

Sin embargo, la acción en el controlador estaba decorada con el atributo HttpPost y, por lo tanto, no pudo encontrar el método y envió una respuesta 404 .

Acabo de arreglar el código para que la falta de coincidencia en los formatos de Fecha no cause un error y el problema se solucione.


No debería ser

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

Además, ¿qué hacen tus filtros? ¿No pueden ocultar la acción, como ActionMethodSelectorAttribute?


Para cualquier persona que tenga este problema con angularjs, MVC y {{imagepath}} escriba inserciones en los atributos de src de la imagen, por ejemplo:

"Un método de acción público ''{{imagepath}} previous.png'' no se encontró en el controlador"

La solución es usar ng-src en lugar de src.

Espero que esto ayude a alguien :)


Tengo el mismo problema en asp.net mvc. este error - 404 no encontrado. MyAppControllerBase problema de esta manera: coloque este código en 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(); }


Tengo un problema similar con la carga de archivos qq

Cuando la acción posterior es /Document/Save obtengo la excepción No se encontró un método de acción pública ''Guardar'' en el controlador ''Project.Controllers.DocumentController''.

¡Pero si la acción posterior es /Document/Save/ , la publicación es correcta y funciona!

Dios salve el / ?


Tuvimos un problema similar, pero descubrimos que estaba sucediendo porque un usuario estaba publicando en un controlador después de que su inicio de sesión había expirado. El sistema luego se redirige a la pantalla de inicio de sesión. Después de iniciar sesión, redirigió a la URL que el usuario intentaba publicar, pero esta vez estaba haciendo una solicitud GET y, por lo tanto, no encontró la acción marcada con un atributo [HttpPost].


Yo también tuve este problema.

En mi caso, estaba relacionado con restricciones verbales en la acción solicitada, donde la vista era un POST pero la vista parcial se solicitaba solo dentro de GET y HEAD compatibles. Agregar el verbo POST a AcceptVerbsAttribute (en MVC 1.0) resolvió el problema.