it-swarm.com.de

Alle ASP.NET-Web-API-Controller geben 404 zurück

Ich versuche, einen API-Controller dazu zu bringen, in einer ASP.NET MVC 4-Webanwendung zu arbeiten. Jede Anfrage führt jedoch zu einem 404 und ich bin überrascht. : /

Ich habe die Standard-API-Controller-Route aus der Projektvorlage wie folgt definiert:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

Die Registrierung wird in Global.asax aufgerufen:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    // Register API routes
    WebApiConfig.Register(GlobalConfiguration.Configuration);

    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

    RouteConfig.RegisterRoutes(RouteTable.Routes);
}

Ich habe einen grundlegenden API-Controller wie diesen:

namespace Website.Controllers
{
    public class FavoritesController : ApiController
    {       
        // GET api/<controller>
        public IEnumerable<string> Get()
        {
            return new [] { "first", "second" };
        }

        // PUT api/<controller>/5
        public void Put(int id)
        {

        }

        // DELETE api/<controller>/5
        public void Delete(int id)
        {

        }
    }
}

Wenn ich nun zu localhost: 59900/api/Favorites navigiere, gehe ich davon aus, dass die Get -Methode aufgerufen wird. Stattdessen bekomme ich einen 404 - Statuscode und die folgende Antwort:

<Error>
   <Message>
       No HTTP resource was found that matches the request URI 'http://localhost:59900/api/Favorites'.
   </Message>
   <MessageDetail>
      No type was found that matches the controller named 'Favorites'.
   </MessageDetail>
</Error>

Jede Hilfe wäre sehr dankbar, ich verliere hier ein wenig den Verstand. :) Vielen Dank!

53
Ted Nyberg

Eine Sache, auf die ich stieß, war, meine Konfigurationen in der falschen Reihenfolge in meiner GLobal.asax-Datei zu registrieren, zum Beispiel:

Richtige Reihenfolge:

AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);

Falsche Bestellung:

AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
WebApiConfig.Register(GlobalConfiguration.Configuration);

Nur zu sagen, dies war mein Problem und das Ändern der Reihenfolge ist offensichtlich, wird aber manchmal übersehen und kann sehr frustrierend sein.

118
Eric Bishard

Hatte im Wesentlichen das gleiche Problem, das in meinem Fall durch Hinzufügen gelöst wurde:

<modules runAllManagedModulesForAllRequests="true" />

zum 

<system.webServer>

</system.webServer>

abschnitt von web.config

12
Zenilogix

Fügen Sie folgende Zeile hinzu

GlobalConfiguration.Configure(WebApiConfig.Register);

in Application_Start() function in Global.ascx.cs datei.

9
Farhan Anwar

Ich habe an einem ähnlichen Problem gearbeitet, und ich habe lange gebraucht, um das Problem zu finden. Es ist nicht die Lösung für diesen speziellen Beitrag, aber hoffentlich spart das Hinzufügen jemandem Zeit, das Problem zu finden, wenn er sucht, warum er einen 404-Fehler für seinen Controller erhält. 

Grundsätzlich hatte ich "Controller" am Ende meines Klassennamens falsch geschrieben. So einfach ist das!

7
user4796368

Erstellen Sie ein Route-Attribut für Ihre Methode.

beispiel 

        [Route("api/Get")]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

Sie können wie folgt anrufen: http: // localhost/api/Get

3
Shakeer Hussain

Ich hatte das gleiche Problem, dann fand ich heraus, dass ich in einem anderen Projekt doppelte API-Controller-Klassennamen hatte, und obwohl "routePrefix" und Namespace und Projektname unterschiedlich waren, aber immer noch 404 zurückgegeben wurden, habe ich das geändert Klassennamen und es hat funktioniert.

3
Aran Dekar

Ein ähnliches Problem mit einer peinlich einfachen Lösung - Stellen Sie sicher, dass Ihre API-Methoden public sind. Wenn Sie keinen Modifizierer für Methodenzugriff auslassen, wird auch ein HTTP 404 zurückgegeben.

Gibt 404 zurück:

List<CustomerInvitation> GetInvitations(){

Wird wie erwartet ausgeführt:

public List<CustomerInvitation> GetInvitations(){
3
BRass

Ich bin ein bisschen verblüfft und nicht sicher, ob dies auf ein Problem mit der HTTP-Ausgabe zurückzuführen ist.

Wie auch immer, "plötzlich hat es richtig funktioniert". :/Das obige Beispiel funktionierte also, ohne dass ich etwas hinzufügte oder änderte.

Ratet mal, der Code musste über Nacht sitzen und kochen ... :)

Danke für die Hilfe, Jungs!

2
Ted Nyberg

Aus Gründen, die mir nicht klar sind, hatte ich alle meine Methoden/Aktionen als statisch deklariert - anscheinend funktioniert das nicht. Also einfach die static weglassen

[AllowAnonymous]
[Route()]
public static HttpResponseMessage Get()
{
    return new HttpResponseMessage(System.Net.HttpStatusCode.OK);
}

Wurden:-

[AllowAnonymous]
[Route()]
public HttpResponseMessage Get()
{
    return new HttpResponseMessage(System.Net.HttpStatusCode.OK);
}
1
Morvael

Ich werde meine Lösung hier hinzufügen, weil ich persönlich diejenigen hasse, die die web.config bearbeiten, ohne zu erklären, was los ist.

Für mich war es, wie die Standard-Handler-Zuordnungen in IIS festgelegt werden. Um das zu überprüfen ...

  1. Öffnen IIS Manager
  2. Klicken Sie auf den Stammknoten Ihres Servers (normalerweise den Namen des Servers).
  3. "Handler-Mappings" öffnen
  4. Klicken Sie im rechten Bereich unter Aktionen auf "Sortierte Liste anzeigen".

Dies ist die Reihenfolge der Handler, die eine Anfrage bearbeiten. Wenn Ihre wie meine sind, befinden sich die Handler "ExtensionlessUrlHandler- *" alle unterhalb des StaticFile-Handlers. Nun, das wird nicht funktionieren, da der StaticFile-Handler einen Platzhalter von * hat und eine 404 zurückgibt, bevor er zu einem Controller ohne Erweiterungen kommt.

Wenn Sie also den "ExtensionlessUrlHandler- *" über die Platzhalter-Handler von TRACE, OPTIONS und StaticFile verschieben, wird der Extensionless-Handler zuerst aktiviert und sollten Ihre Controller in jeder im System laufenden Website richtig reagieren können.

Hinweis: .__ Dies geschieht im Wesentlichen, wenn Sie die Module in der web.config entfernen und hinzufügen, jedoch an einem einzigen Ort, um sie für alles zu lösen. Und es erfordert keinen zusätzlichen Code!

1
k2snowman69

Hatte dieses Problem. Musste Precompile during publishing deaktivieren.

0
user7885142

Ich habe ein ähnliches Problem gelöst, indem ich den Anwendungs-Init mit dem Debugger verbunden habe. Starten Sie einfach den Webserver (greifen Sie beispielsweise auf localhost zu), stellen Sie eine Verbindung zu w3wp her und prüfen Sie, ob die Initialisierung der App ordnungsgemäß abgeschlossen wurde. In meinem Fall gab es eine Ausnahme und Controller wurden nicht registriert.

0
Pavel
WebApiConfig.Register(GlobalConfiguration.Configuration);

Sollte in App_start das erste Ereignis sein. Ich habe es an letzter Stelle in APP_start versucht, aber das hat nicht funktioniert.

0
Ram

Überprüfen Sie, ob Ihre Controller-Klasse über das Attribut [RoutePrefix ("somepath")] verfügt, dass alle Controller-Methoden auch über ein Attribut [Route ()] verfügen.

Ich bin auch auf dieses Problem gestoßen und habe mir einige Zeit den Kopf gekratzt.

0
Kevin R.

Fügen Sie dies zu <system.webServer> in Ihrer web.config hinzu:

<handlers>
    <remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
    <remove name="OPTIONSVerbHandler"/>
    <remove name="TRACEVerbHandler"/>
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler"
        preCondition="integratedMode,runtimeVersionv4.0"/>
</handlers>

Das Hinzufügen von <modules runAllManagedModulesForAllRequests="true" /> funktioniert ebenfalls, wird jedoch aufgrund von Leistungsproblemen nicht empfohlen.

0
Davoud Zeini

Ich hatte die gleiche 404-Problematik und keine der hier gewählten Lösungen funktionierte. In meinem Fall habe ich eine Unteranwendung mit einer eigenen web.config, und ich hatte ein eindeutiges Tag im Abschnitt httpModules web.config der übergeordneten Komponente. In IIS gelten alle web.config-Einstellungen des übergeordneten Elements für die Unteranwendung.

<system.web>    
  <httpModules>
    <clear/>
  </httpModules>
</system.web>

Die Lösung besteht darin, das "clear" -Tag zu entfernen und möglicherweise in der web.config des übergeordneten Elements "InhabingChildApplications =" ​​false "hinzuzufügen. Bei der InateritInChildApplications-Option IIS werden die Konfigurationseinstellungen nicht auf die Unteranwendung angewendet. 

<location path="." inheritInChildApplications="false">
  <system.web>
  ....
  <system.web>
</location>
0
Hartono Halim