Estou recebendo uma exceção intermitente dizendo que asp.net mvc não consegue encontrar o método de ação. Aqui está a exceção:
Um método de ação pública 'Fill' não pôde ser encontrado no controlador 'Schoon.Form.Web.Controllers.ChrisController'.
Acho que tenho o roteamento configurado corretamente porque este aplicativo funciona na maioria das vezes. Aqui está o método de ação do controlador.
[ActionName("Fill")]
[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post), UserIdFilter, DTOFilter]
public ActionResult Fill(int userId, int subscriberId, DisplayMode? mode)
{
//…
}
O percurso:
routes.MapRoute(
"SchoonForm",
"Form/Fill/{subscriberId}",
new { controller = "ChrisController", action = "Fill" },
new { subscriberId = @"\d+" }
);
E aqui está a pilha:
System.Web.HttpException: Um método de ação pública 'Preencher' não pôde ser encontrado no controlador 'Schoon.Form.Web.Controllers.ChrisController'. em System.Web.Mvc.Controller.HandleUnknownAction (String actionName) em C: \ dev \ ThirdParty \ MvcDev \ src \ SystemWebMvc \ Mvc \ Controller.cs: linha 197 em System.Web.Mvc.Controller.ExecuteCore () em C : \ dev \ ThirdParty \ MvcDev \ src \ SystemWebMvc \ Mvc \ Controller.cs: linha 164 em System.Web.Mvc.ControllerBase.Execute (RequestContext requestContext) em C: \ dev \ ThirdParty \ MvcDev \ src \ SystemWebMvc \ Mvc \ ControllerBase.cs: linha 76 em System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute (RequestContext requestContext) em C: \ dev \ ThirdParty \ MvcDev \ src \ SystemWebMvc \ Mvc \ ControllerBase.cs: linha 87 em System.Web.Mvc.MvcHandler.ProcessRequest (HttpContextBase httpContext) em C:
Aqui está um exemplo de meus filtros, todos eles funcionam da mesma maneira:
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);
}
}
Obrigado chris
fonte
PostSomething { return HomePageActionMethod() }
falha ondePostSomething { return RedirectToAction(nameof(HomePageActionMethod)); }
funciona. (em nosso caso, a ação ofensiva na visualização está localizada em um controlador diferente e, presumivelmente, esse controlador não foi totalmente inicializado com o primeiro método de chamada.Respostas:
Encontramos a resposta. Verificamos nossos registros da web. Ele mostrou que estávamos recebendo algumas ações http estranhas (verbos / métodos) como OPTIONS, PROPFIND e HEAD.
Essa parece ser a causa de algumas dessas exceções. Isso explica por que era intermitente.
Reproduzimos o problema com a ferramenta curl.exe:
A correção que usamos foi adicionar uma seção de autorização ao web.config:
fonte
Tivemos um problema semelhante, mas descobrimos que isso estava acontecendo porque um usuário estava postando em um controlador depois que seu login expirou. O sistema então redirecionou para a tela de login. Depois de fazer login, ele redirecionava de volta para a URL em que o usuário estava tentando postar, mas desta vez estava fazendo uma solicitação GET e, portanto, não encontrando a ação que estava marcada com um atributo [HttpPost].
fonte
Eu tenho o mesmo problema no asp.net mvc. este erro - 404 não encontrado. Eu resolvo o problema desta forma - coloque este código em
MyAppControllerBase
(MVC)fonte
Acabamos de ter o mesmo problema em nosso aplicativo e fui capaz de rastreá-lo a um problema de javascript / jquery. Temos links em nosso aplicativo definidos usando Html.ActionLink () que mais tarde são substituídos em POSTs por jquery.
Primeiro definimos o link:
Posteriormente, substituímos a ação padrão com nossa função SomePostEventHandler:
Isso estava atingindo nossa ação MVC que tinha um filtro HttpPost:
O que descobrimos é que na maioria das vezes isso funcionava muito bem. No entanto, em alguns carregamentos de página lentos (ou usuários realmente rápidos), o usuário clicava no link antes do evento jquery $ (document) .ready () ser disparado, o que significa que eles estavam tentando GET / Controller / SomeAction / XX em vez de postagem.
Não queremos que o usuário OBTENHA esse url, portanto, remover o filtro não é uma opção para nós. Em vez disso, apenas conectamos o evento onclick do link de ação diretamente (tivemos que alterar SomePostEventHandler () ligeiramente para que funcionasse):
Portanto, a moral da história, pelo menos para nós, é que, se você está vendo esses erros, rastreie a URL para a qual você ACHA que está postando e certifique-se de que está.
fonte
Eu também tive esse problema.
No meu caso, estava relacionado a restrições de verbos na ação solicitada, onde a visão era uma,
POST
mas a visão parcial sendo solicitada em suportadoGET
eHEAD
somente. Adicionar oPOST
verbo aoAcceptVerbsAttribute
(no MVC 1.0) resolveu o problema.fonte
A partir dos registros do IIS, nosso problema foi causado por uma tentativa do Googlebot de POST e GET para uma ação do controlador somente POST.
Para este caso, eu recomendo lidar com a sugestão 404 like Dmitriy.
fonte
A resposta aceita atualmente funciona conforme o esperado, mas não é o caso de uso principal para o recurso. Em vez disso, use o recurso definido pelo ASP.NET. No meu caso, neguei tudo, exceto GET e POST:
Com o snippet de código acima, o MVC retornará corretamente um 404
fonte
Não deveria ser
Além disso, o que seus filtros fazem? Eles não podem ocultar a ação, como ActionMethodSelectorAttribute?
fonte
Tenho um problema semelhante com qq File Upload
Quando a ação post é
/Document/Save
, recebo a exceção Um método de ação pública 'Salvar' não foi encontrado no controlador 'Project.Controllers.DocumentController'.Mas se a ação da postagem for
/Document/Save/
, a postagem está correta e funciona!Deus salve o / ?
fonte
Minha causa raiz era semelhante à mencionada no comentário.
Eu era
ajaxSubmitting
um formulário com o clique de um botão. Um dos campos do formulário era do tipoDate
. No entanto, devido à diferença nos formatos de data entre a máquina cliente e servidor, ela não executou o método POST no controlador. O servidor enviou de volta uma302
resposta e, em seguida, enviou umaGET
solicitação para o mesmo método novamente.No entanto, a ação no controlador foi decorada com o
HttpPost
atributo e, portanto, não pôde encontrar o método e enviou de volta uma404
resposta.Acabei de consertar o código de forma que a incompatibilidade nos formatos de data não causasse um erro e o problema foi corrigido.
fonte
Remova os
[HttpGet]
atributos e vai funcionar :)fonte
[HttpGet]
atributos ali propositalmente, para evitar que as ações sejam chamadas por quaisquer outros VERBOSPara qualquer pessoa que tenha este problema com angularjs, MVC e {{imagepath}} digite inserções nos atributos src da imagem, por exemplo:
"Um método de ação pública '{{imagepath}} previous.png' não foi encontrado no controlador"
A solução é usar ng-src em vez de src.
Espero que isso ajude alguém :)
fonte
Veja se simplesmente navegar até o URL em questão é suficiente para reproduzir o erro. Seria se a ação fosse definida apenas como uma ação POST. Isso permite que você reproduza o erro à vontade.
Em qualquer caso, você pode lidar globalmente com o erro conforme abaixo. Outra resposta aqui que faz referência
HandleUnknownAction
tratam apenas de URLs com nomes de ação inválidos, não nomes de controladores ruins. A abordagem a seguir trata de ambos.Adicione isso ao seu controlador de base (veja o código omitido aqui):
Adicione um manipulador de exceção global a Global.asax.cs que chama o método acima ou faz o que quer que você queira fazer com o erro 404 detectado:
fonte