Recibo una excepción intermitente que dice que asp.net mvc no puede encontrar el método de acción. Esta es la excepción:
No se pudo encontrar un método de acción pública 'Fill' en el controlador 'Schoon.Form.Web.Controllers.ChrisController'.
Creo que tengo el enrutamiento configurado 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:
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
fuente
PostSomething { return HomePageActionMethod() }
falla dondePostSomething { return RedirectToAction(nameof(HomePageActionMethod)); }
trabaja. (en nuestro caso, la acción ofensiva en la vista se encuentra en un controlador diferente, y presumiblemente ese controlador no está completamente inicializado con el primer método de llamada.Respuestas:
Encontramos la respuesta. Examinamos nuestros registros web. Demostró que estábamos recibiendo algunas acciones http extrañas (verbos / métodos) 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:
La solución que usamos fue agregar una sección de autorización a web.config:
fuente
Tuvimos un problema similar, pero descubrimos que estaba sucediendo porque un usuario estaba publicando en un controlador después de que se agotó el tiempo de inicio de sesión. A continuación, el sistema se redirige a la pantalla de inicio de sesión. Después de iniciar sesión, se redirigió a la URL en la que el usuario intentaba publicar, pero esta vez estaba haciendo una solicitud GET y, por lo tanto, no encontró la acción que estaba marcada con un atributo [HttpPost].
fuente
Tengo el mismo problema en asp.net mvc. este error - 404 no encontrado. Resuelvo el problema de esta manera: ponga este código en
MyAppControllerBase
(MVC)fuente
Simplemente tuvimos el mismo problema en nuestra aplicación y pude rastrearlo hasta un problema de javascript / jquery. Tenemos enlaces en nuestra aplicación definidos usando Html.ActionLink () que luego son reemplazados en POST por jquery.
Primero habíamos definido el enlace:
Más tarde, anulamos la acción predeterminada con nuestra función SomePostEventHandler:
Esto estaba afectando a nuestra acción MVC que tenía un filtro HttpPost:
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 se activara el evento jquery $ (document) .ready (), lo que significa que intentaban GET / Controller / 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):
Entonces, la moraleja de la historia, al menos para nosotros, es que si está viendo estos errores, busque la URL que PIENSA que está PUBLICANDO y asegúrese de que lo está.
fuente
Yo también tuve este problema.
En mi caso, estaba relacionado con restricciones de verbos en la acción solicitada, donde la vista era una,
POST
pero la vista parcial se solicitaba dentro de admitidaGET
yHEAD
única. Agregar elPOST
verbo aAcceptVerbsAttribute
(en MVC 1.0) resolvió el problema.fuente
A partir de los registros de IIS, nuestro problema fue causado por el robot de Google que intentó POST y GET para una acción de controlador solo POST.
Para este caso recomiendo manejar el 404 como la sugerencia de Dmitriy.
fuente
La respuesta aceptada actualmente funciona como se esperaba, pero no es el caso de uso principal de la función. En su lugar, utilice la función definida por ASP.NET. En mi caso, negué todo menos OBTENER y PUBLICAR:
Con el fragmento de código anterior, MVC devolverá correctamente un 404
fuente
No debería ser
Además, ¿qué hacen sus filtros? ¿No pueden ocultar la acción, como ActionMethodSelectorAttribute?
fuente
Tengo un problema similar con la carga de archivos qq
Cuando la acción de publicación 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 de publicación es
/Document/Save/
, ¡la publicación es correcta y funciona!Dios salve el / ?
fuente
Mi causa raíz fue similar a la mencionada en el comentario.
Yo era
ajaxSubmitting
un formulario con el clic de un botón. Uno de los campos del formulario era de tipoDate
. Sin embargo, debido a la diferencia en los formatos de fecha entre el cliente y la máquina del servidor, no ejecutó el método POST en el controlador. El servidor envió una302
respuesta y luego envió unaGET
solicitud para el mismo método nuevamente.Sin embargo, la acción en el controlador estaba decorada con el
HttpPost
atributo y, por lo tanto, no pudo encontrar el método y envió una404
respuesta.Acabo de arreglar el código de modo que la falta de coincidencia en los formatos de fecha no causara un error y el problema se solucionó.
fuente
Elimina los
[HttpGet]
atributos y funcionará :)fuente
[HttpGet]
atributos allí a propósito, para evitar que las acciones sean invocadas a través de otros VERBOSPara cualquiera que tenga este problema con angularjs, MVC y las inserciones de tipo {{imagepath}} en los atributos de image src, por ejemplo:
"No se encontró un método de acción pública '{{imagepath}} previous.png' en el controlador"
La solución es usar ng-src en lugar de src.
Espero que esto ayude a alguien :)
fuente
Vea si simplemente navegar a la URL en cuestión es suficiente para reproducir el error. Lo sería si la acción solo se definiera como una acción POST. Hacer esto le permite reproducir el error a voluntad.
En cualquier caso, puede manejar globalmente el error como se muestra a continuación. Otra respuesta aquí que las referencias
HandleUnknownAction
solo manejan URL con nombres de acción incorrectos, no nombres de controlador incorrectos. El siguiente enfoque maneja ambos.Agregue esto a su controlador base (ver código omitido aquí):
Agregue un controlador de excepción global a Global.asax.cs que llame al método anterior o haga cualquier otra cosa que desee hacer con el error 404 detectado:
fuente