it-swarm.com.de

ASP.NET MVC WebAPI 404-Fehler

Ich habe eine asp.net Web Forms-Anwendung, die im integrierten Modus v4.0 ausgeführt wird.

Ich habe versucht, einen Apicontroller im Ordner App_Code hinzuzufügen. 

In der Global.asax habe ich den folgenden Code hinzugefügt

 RouteTable.Routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "api/{controller}/{id}",
      defaults: new { id = System.Web.Http.RouteParameter.Optional }
 );

Wenn ich versuchte, unter http://localhost/api/Value zum Controller zu navigieren, erhalte ich den Fehler 404.

Die extensionless-URL wird im Handler-Abschnitt konfiguriert. Ich habe Formulare und anonyme Authentifizierung für die Website aktiviert. 

ExtensionLess-URL ist für '*' konfiguriert.

Wenn ich die URL für den Controller drücke, wird die Anforderung von StaticHandler statt von ExtensionlessUrlHandler-Integrated-4.0 verarbeitet. 

Ich habe jetzt keine Ahnung, warum das System den Fehler auslöst, wie in der Abbildung unten gezeigt.Error

59
Suneel Dixit

Ich hatte dieses Problem.

Ich habe versucht, meinen WebApiConfig.cs zu bearbeiten, um eine Reihe von Empfehlungen zu erfüllen und an anderen Stellen Code-Beispiele zu verwenden. Einige funktionierten, aber es erklärte nicht, warum die Route nicht funktionierte, wenn WebApiConfig.cs genau gemäß dem MS-Template-WebApi-Projekt codiert wurde.

Mein eigentliches Problem bestand darin, dass ich beim manuellen Hinzufügen von WebApi zu meinem Projekt die Reihenfolge der Konfigurationsaufrufe von Global.asax nicht beachtet hatte.

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        // This is where it "should" be
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        // The WebApi routes cannot be initialized here.
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }

Ich könnte raten, warum dies so ist, aber ich habe nicht weiter nachgeforscht. Es war nicht intuitiv, um es gelinde auszudrücken.

107
shannon

Das Problem liegt in Ihrer Routing-Konfiguration. Mvc routing unterscheidet sich von WebApi routing.

Fügen Sie einen Verweis auf System.Web.Http.dll, System.Web.Http.Webhost.dll und System.Net.Http.dll hinzu und konfigurieren Sie dann Ihr API-Routing wie folgt: 

   GlobalConfiguration.Configuration.Routes.MapHttpRoute(
     name: "DefaultApi",
     routeTemplate: "api/{controller}/{id}",
     defaults: new { id = System.Web.Http.RouteParameter.Optional }
   );
32
Alborz

Stellen Sie die folgenden Dinge sicher

1.) Stellen Sie sicher, dass Ihre IIS mit .NET 4.5 oder 4.0 konfiguriert ist, wenn Ihre Web-API 4.5 ist. Installieren Sie 4.5 in IIS. 

führen Sie diesen Befehl in der Eingabeaufforderung mit Administratorrechten aus

C:\Windows\Microsoft.NET\Framework\v4.0.30319>aspnet_regiis.exe -i

2.) Ändern Sie Ihren Arbeitsplan in 

RouteTable.Routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "{controller}/{id}",
      defaults: new { id = System.Web.Http.RouteParameter.Optional }
 );

und machen Sie eine Anfrage mit Demo/Get (wobei Demo Ihr Controller-Name ist)

wenn die 1,2 nicht funktionieren versuchen sie 3

3.) Fügen Sie die folgende Konfiguration in die Datei web.config ein

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />

</system.webServer>
16
Binson Eldhose

Stellen Sie außerdem sicher, dass Ihr Controller mit dem Namen "Controller" wie in "PizzaPieController" endet.

9
Eric W.

Ich habe alles ausprobiert und hatte das gleiche Problem. Es stellte sich heraus, dass der in IIS erstellte App-Pool auf .net 2.0 eingestellt war. Als ich es auf 4.0 änderte, funktionierte es wieder

7
Alan

Wenn Sie den Controller in App_Code erstellen, woher weiß die Routingtabelle, wo sie sich befindet? Sie haben die Route als "api/{controller/..." angegeben, aber dort befindet sich der Controller nicht. Verschieben Sie es in den richtigen Ordner.

2
crunchy

Danke Shannon, funktioniert super =>

Meine Bestellung in meiner Global.asax war:

GlobalConfiguration.Configure(WebApiConfig.Register);  
RouteConfig.RegisterRoutes(RouteTable.Routes);

anstelle des Guten: 

RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register); 
2
ceinpap

Nachdem ich stundenlang Zeit damit verbracht hatte, fand ich in meinem Fall die Lösung dafür.

Es war die Reihenfolge der Registrierung der Routen in RouteConfig

Wir sollten die HttpRoute in der Routentabelle vor der Default Controller Route registrieren. Es sollte wie folgt sein. Route Config Routentabelle konfigurieren

  public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.MapHttpRoute(
             name: "DefaultApi",
             routeTemplate: "api/{controller}/{action}/{id}",
             defaults: new { id = RouteParameter.Optional }
         );
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

    }
}
2
Shri Guru

Versuchen Sie auch, den gesamten Inhalt des Ordners api bin zu löschen. Meine enthielt alte DLLs (wegen der Umbenennung großer Namespaces), die in Konflikt stehende Controller enthüllten. Diese DLL-Dateien wurden von der Clean-Funktionalität von Visual Studio nicht gelöscht.

(Allerdings finde ich, dass asp.net web api auf der Debug-Ebene ernsthaft Routing- und Debugging-Informationen hat).

2
Simon Budin

Vergewissern Sie sich, dass es sich bei der von Ihnen verwendeten URL (http://localhost/api/Value) um einen öffentlichen Typ mit dem Namen ValueController handelt, der von ApiController abgeleitet ist und über eine öffentliche Methode mit folgenden Eigenschaften verfügt: 

  • Der Methodenname beginnt mit Get (z. B. GetValues oder einfach Get).
  • Auf die Methode wird ein HttpGet-Attribut angewendet.

Falls Sie den Code aus der Standard-Web-API-Projektvorlage versuchen, lautet der Name des Controllers ValuesController und nicht ValueController. Die URL lautet http://localhost/api/values.

Wenn keine der oben genannten Maßnahmen hilfreich ist, möchten Sie möglicherweise die Ablaufverfolgung aktivieren , die Ihnen nützliche Informationen darüber gibt, wo in der Pipeline der Fehler auftritt (und warum).

Hoffe das hilft.

1
volpav

Ich habe eine RouteAttribute-basierte Controller-DLL in den Bin-Ordner kopiert, aber sie wurde nicht als gültiger Controller erkannt und der 404-Fehler wurde auf dem Client angezeigt.

Nach vielem Debuggen fand ich mein Problem. Die Version von System.Web.Http.dll, auf die der Controller referenzierte, unterschied sich von der Version von System.Web.Http.dll, sodass das Hauptprojekt (das Projekt, das global.asax.cs enthält) referenzierte.

Asp.Net findet den Controller durch Reflexion mit einem solchen Code

internal static bool IsControllerType(Type t)
{
    return
        t != null &&
        t.IsClass &&
        t.IsVisible &&
        !t.IsAbstract &&
        typeof(IHttpController).IsAssignableFrom(t) &&
        HasValidControllerName(t);
}

Da IHttpController für jede Version von System.Web.Http.dll unterschiedlich ist, müssen Controller und Hauptprojekt dieselbe Referenz haben.

1
tcb

Wir hatten auch das, indem wir die .NET-Version von 4.5 auf 4.5.1 änderten oder neuere Probleme lösten 

1
Eric Herlitz

Versuchen Sie es einfach mit dem Value-Teil des Controller-Namens wie folgt:

http://localhost/api/Value

Hinweis: Die Routing-Engine nimmt standardmäßig einen als Controller-Namen übergebenen Wert an und fügt das Wort Controller hinzu. Durch das Einfügen von ValueController in den URI musste das Routingmodul nach einer Klasse mit dem Namen ValueControllerController suchen, die nicht gefunden wurde.

0
Karl Anderson

Es ist Zeit für mich, mein albernes Versehen in die Liste aufzunehmen: Ich habe meinen Webapi-Standardroutenpfad falsch geschrieben.

Original:

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/id",
            defaults: new { id = RouteParameter.Optional}
        );

Fixed: (beobachte die geschweiften Klammern um "id")

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional}
        );
0
Mansfield

Ihre Routenkonfiguration sieht gut aus. Überprüfen Sie den Handlers-Abschnitt in web.config noch einmal. Für den integrierten Modus ist dies der richtige Weg, um ExtensionLessUrlHandler zu verwenden:

<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

Mehr zum Thema: http://blogs.msdn.com/b/tmarq/archive/2010/05/26/how-extensionless-urls-are-handled-by-asp-net-v4. aspx

0
dbalogh

In meinem Fall habe ich vergessen, es von ApiController ableiten zu lassen. 

So würde es aussehen 

public class ValuesController : ApiController
0
aoakeson

Keine der obigen Lösungen löste mein Problem ... Mein Fehler war, dass ich die bin-Dateien direkt auf den Produktionsserver kopiert habe und dann nicht mehr funktioniert. Der 404 war verschwunden, als ich das Projekt auf der Festplatte veröffentlichte, und den "veröffentlichten" Ordner auf den Server kopiert. Es ist ein wenig offensichtlich, kann aber jemandem helfen.

0
Tiago Gouvêa

Ich schätze, dass dies eine sehr alte Frage ist, aber ich dachte, ich würde eine weitere Antwort für zukünftige Benutzer hinzufügen.

Ich fand das gerade in einem Projekt, an dem ich gerade arbeitete, nachdem es für CI/Staging bereitgestellt wurde. Die Lösung bestand darin, den Kompilierungswert debug = "true" hin und her zu schalten, während jede Version einmal für jede Umgebung bereitgestellt wurde.

0
Lari Tuomisto