Ich erhalte eine zeitweise Ausnahme, die besagt, dass asp.net mvc die Aktionsmethode nicht finden kann. Hier ist die Ausnahme:
Eine öffentliche Aktionsmethode 'Fill' konnte auf dem Controller 'Schoon.Form.Web.Controllers.ChrisController' nicht gefunden werden.
Ich glaube, ich habe das Routing richtig eingerichtet, da diese Anwendung die meiste Zeit funktioniert. Hier ist die Aktionsmethode des Controllers.
[ActionName("Fill")]
[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post), UserIdFilter, DTOFilter]
public ActionResult Fill(int userId, int subscriberId, DisplayMode? mode)
{
//…
}
Die Route:
routes.MapRoute(
"SchoonForm",
"Form/Fill/{subscriberId}",
new { controller = "ChrisController", action = "Fill" },
new { subscriberId = @"\d+" }
);
Und hier ist der Stapel:
System.Web.HttpException: Eine öffentliche Aktionsmethode 'Fill' wurde auf dem Controller 'Schoon.Form.Web.Controllers.ChrisController' nicht gefunden. bei System.Web.Mvc.Controller.HandleUnknownAction (String actionName) in C: \ dev \ ThirdParty \ MvcDev \ src \ SystemWebMvc \ Mvc \ Controller.cs: Zeile 197 bei System.Web.Mvc.Controller.ExecuteCore () in C. : \ dev \ ThirdParty \ MvcDev \ src \ SystemWebMvc \ Mvc \ Controller.cs: Zeile 164 in System.Web.Mvc.ControllerBase.Execute (RequestContext requestContext) in C: \ dev \ ThirdParty \ MvcDev \ src \ SystemWebMvc \ Mvc \ ControllerBase.cs: Zeile 76 in System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute (RequestContext requestContext) in C: \ dev \ ThirdParty \ MvcDev \ src \ SystemWebMvc \ Mvc \ ControllerBase.cs: Zeile 87 bei System.Web.Mvc.MvcHandler.ProcessRequest (HttpContextBase httpContext) in C:
Hier ist ein Beispiel für meine Filter, die alle auf die gleiche Weise funktionieren:
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);
}
}
Danke, Chris
quelle
PostSomething { return HomePageActionMethod() }
schlägt fehl, woPostSomething { return RedirectToAction(nameof(HomePageActionMethod)); }
funktioniert. (In unserem Fall befindet sich die fehlerhafte Aktion in der Ansicht in einem anderen Controller, und vermutlich wird dieser Controller mit der erstenAntworten:
Wir haben die Antwort gefunden. Wir haben in unsere Weblogs geschaut. Es zeigte sich, dass wir einige seltsame http-Aktionen (Verben / Methoden) wie OPTIONS, PROPFIND und HEAD erhielten.
Dies scheint die Ursache einiger dieser Ausnahmen zu sein. Dies erklärt, warum es zeitweise war.
Wir haben das Problem mit dem Tool curl.exe reproduziert:
Das von uns verwendete Update bestand darin, web.config einen Autorisierungsabschnitt hinzuzufügen:
quelle
Wir hatten ein ähnliches Problem, stellten jedoch fest, dass dies geschah, weil ein Benutzer nach Ablauf der Zeit für die Anmeldung einen Beitrag auf einem Controller veröffentlichte. Das System wurde dann zum Anmeldebildschirm umgeleitet. Nach dem Anmelden wurde es zurück zu der URL umgeleitet, unter der der Benutzer posten wollte, diesmal jedoch stattdessen eine GET-Anforderung ausführte und daher die Aktion nicht fand, die mit einem [HttpPost] -Attribut markiert war.
quelle
Ich habe das gleiche Problem in asp.net mvc. Dieser Fehler - 404 wurde nicht gefunden. Ich löse das Problem auf diese Weise - setzen Sie diesen Code in
MyAppControllerBase
(MVC)quelle
Wir hatten gerade das gleiche Problem in unserer Anwendung und ich konnte es auf ein Javascript / JQuery-Problem zurückführen. Wir haben Links in unserer Anwendung, die mit Html.ActionLink () definiert wurden und später von jquery in POSTs überschrieben werden.
Zuerst hatten wir den Link definiert:
Später überschreiben wir die Standardaktion mit unserer SomePostEventHandler-Funktion:
Dies traf unsere MVC-Aktion mit einem HttpPost-Filter:
Was wir fanden ist, dass dies die meiste Zeit großartig funktioniert hat. Bei einigen langsamen Seitenladevorgängen (oder sehr schnellen Benutzern) klickte der Benutzer jedoch auf den Link, bevor das Ereignis jquery $ (document) .ready () ausgelöst wurde, was bedeutet, dass er versuchte, stattdessen GET / Controller / SomeAction / XX zu verwenden Buchung.
Wir möchten nicht, dass der Benutzer diese URL erhält, daher ist das Entfernen des Filters für uns keine Option. Stattdessen haben wir das onclick-Ereignis des Aktionslinks direkt verkabelt (wir mussten SomePostEventHandler () leicht ändern, damit dies funktioniert):
Zumindest für uns ist die Moral der Geschichte, dass Sie, wenn Sie diese Fehler sehen, die URL aufspüren, an die Sie denken, dass Sie posten, und sicherstellen, dass Sie es sind.
quelle
Ich hatte auch dieses Problem.
In meinem Fall handelte es sich um Verbbeschränkungen für die angeforderte Aktion, bei denen es sich bei der Ansicht um eine
POST
Ansicht handelte, die jedoch nur innerhalb der unterstütztenGET
und angeforderten Ansicht angefordert wurdeHEAD
. Das Hinzufügen desPOST
Verbs zuAcceptVerbsAttribute
(in MVC 1.0) löste das Problem.quelle
In den IIS-Protokollen wurde unser Problem dadurch verursacht, dass Googlebot POST und ein GET für eine Nur-POST-Controller-Aktion versuchte.
Für diesen Fall empfehle ich, den 404 wie Dmitriy Vorschlag zu behandeln.
quelle
Die aktuell akzeptierte Antwort funktioniert wie erwartet, ist jedoch nicht der primäre Anwendungsfall für die Funktion. Verwenden Sie stattdessen die von ASP.NET definierte Funktion. In meinem Fall habe ich alles außer GET und POST abgelehnt:
Mit dem obigen Code-Snippet gibt MVC einen 404 korrekt zurück
quelle
Sollte es nicht sein
Was machen Ihre Filter? Können sie keine Aktionen wie ActionMethodSelectorAttribute ausblenden?
quelle
Ich habe das ähnliche Problem mit qq File Upload
Wenn die Post-Aktion ist,
/Document/Save
erhalte ich die Ausnahme. Eine öffentliche Aktionsmethode 'Speichern' wurde auf dem Controller 'Project.Controllers.DocumentController' nicht gefunden.Aber wenn die Post-Aktion ist
/Document/Save/
, ist der Post korrekt und funktioniert!Gott schütze das / ?
quelle
Meine Grundursache war ähnlich der im Kommentar erwähnten.
Ich war
ajaxSubmitting
ein Formular auf Knopfdruck. Eines der Formularfelder war vom TypDate
. Aufgrund der unterschiedlichen Datumsformate zwischen Client und Server wurde die POST-Methode im Controller jedoch nicht ausgeführt. Der Server hat eine302
Antwort zurückgesendet und dann erneut eineGET
Anfrage für dieselbe Methode gesendet .Die Aktion in der Steuerung wurde jedoch mit dem
HttpPost
Attribut versehen, sodass die Methode nicht gefunden und eine404
Antwort zurückgesendet werden konnte.Ich habe den Code nur so behoben, dass die Nichtübereinstimmung in den Datumsformaten keinen Fehler verursacht und das Problem behoben wurde.
quelle
Entferne das
[HttpGet]
Attribute und es wird funktionieren :)quelle
[HttpGet]
Attribute absichtlich dort platzieren, um zu verhindern, dass die Aktionen durch andere VERBs aufgerufen werdenFür alle, die dieses Problem mit anglejs haben, fügen MVC- und {{imagepath}} -Typen Einfügungen in image src-Attribute ein, z.
"Eine öffentliche Aktionsmethode '{{imagepath}} previous.png' wurde auf dem Controller nicht gefunden."
Die Lösung besteht darin, ng-src anstelle von src zu verwenden.
Hoffe das hilft jemandem :)
quelle
Überprüfen Sie, ob das einfache Navigieren zu der betreffenden URL ausreicht, um den Fehler zu reproduzieren. Dies wäre der Fall, wenn die Aktion nur als POST-Aktion definiert würde. Auf diese Weise können Sie den Fehler nach Belieben reproduzieren.
In jedem Fall können Sie den Fehler wie folgt global behandeln. Eine andere Antwort hier, die verweist, behandelt
HandleUnknownAction
nur URLs mit falschen Aktionsnamen, keine falschen Controllernamen. Der folgende Ansatz behandelt beide.Fügen Sie dies Ihrem Basis-Controller hinzu (Ansichtscode hier weggelassen):
Fügen Sie Global.asax.cs einen globalen Ausnahmebehandler hinzu, der die oben beschriebene Methode aufruft oder mit dem abgefangenen 404-Fehler alles andere tut, was Sie möchten:
quelle