c# asp.net - 404 Fehler nach dem Hinzufügen von Web-API zu einer vorhandenen MVC-Webanwendung




tutorial ihttpactionresult (4)

Es gibt eine gute Frage hier: Wie Web API zu einem vorhandenen ASP.NET MVC 4 Web Application-Projekt hinzufügen?

Leider war es nicht genug, um mein Problem zu lösen. Ich habe zweimal versucht, sicher zu sein, dass ich nichts falsch gemacht habe. Ich habe mit der rechten Maustaste auf "Controller" geklickt und den Punkt "Web API 2 Controller mit Aktionen mit Entity Framework" hinzugefügt, wo ich meine Model-Klasse und den db-Kontext ausgewählt habe. Alles ist gut gelaufen ... aber trotzdem ... jedes Mal, wenn ich versucht habe, auf / api / Rest zuzugreifen, bekam ich einen Fehler 404 (Der Name meines Controllers ist RestController).


Answers

Es funktioniert!!! Ich wollte nicht glauben, aber raten Sie mal, das Problem war mit der Global.asax Routing- Reihenfolge verbunden .

Während es nicht funktioniert mit:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    GlobalConfiguration.Configure(WebApiConfig.Register); //I AM THE 4th
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}      

Es funktioniert mit:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configure(WebApiConfig.Register); //I AM THE 2nd
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}      

Verrückt, ich weiß.


Wenn Sie WebAPI in einem vorhandenen MVC (5) -Projekt verwenden möchten, müssen Sie folgende Schritte ausführen:
1. Fügen Sie WebApi-Pakete hinzu:

Microsoft.AspNet.WebApi
Microsoft.AspNet.WebApi.Client
Microsoft.AspNet.WebApi.Core
Microsoft.AspNet.WebApi.WebHost
Newtonsoft.Json

2. WebApiConfig.cs Datei App_Start Ordner App_Start hinzu:

using System.Web.Http;

namespace WebApiTest
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

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

3. Fügen Sie Glabal.asax die folgende Zeile Glabal.asax :

GlobalConfiguration.Configure(WebApiConfig.Register);

Wichtiger Hinweis: Sie müssen oberhalb der Zeile genau nach AreaRegistration.RegisterAllAreas();

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    //\\
    GlobalConfiguration.Configure(WebApiConfig.Register);
    //\\
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

"Beim Hinzufügen neuer Routen IMMER BEACHTEN SIE, dass Sie am Ende eine bestimmte Route hinzufügen müssen, gefolgt von einer generischeren Route. Andernfalls wird Ihre Web-Anwendung niemals ordnungsgemäß weitergeleitet."

Das obige ist das Zitat von hier: http://www.codeproject.com/Tips/771809/Understanding-the-Routing-Framework-in-ASP-NET-MVC

Ich weiß, dass die Antwort bereits gegeben ist, aber das könnte helfen zu verstehen, warum wir GlobalConfiguration.Configure (WebApiConfig.Register); vor RouteConfig.RegisterRoutes (RouteTable.Routes);


Das Bearbeiten eines der Aktionsparameter mit [FromBody] löste das Problem für mich:

public async Task<IHttpActionResult> SetAmountOnEntry(string id, [FromBody]int amount)

ASP.NET würde dies jedoch korrekt ableiten, wenn ein komplexes Objekt im Methodenparameter verwendet wurde:

public async Task<IHttpActionResult> UpdateEntry(string id, MyEntry entry)






c# asp.net asp.net-mvc rest asp.net-web-api