2016-03-29 12 views
3

So habe ich bereits 1 Web API eingerichtet und funktioniert gut, aber jetzt, wo ich versuche, mein eigenes Admin-Panel (was ich getan habe), muss ich die verwenden DeleteUser() Funktion von der Web-API mit dem Namen AdminApi, aber ich kann nicht scheinen, es funktioniert zu bekommen. Ich bekomme 404 Fehler, während ich den Pfad gebe, auf dem die API sein sollte.ASP.Net Web API 404 Fehler auf der 2. API

Web Api Config:

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}/{action}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

Global:

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

    //Create the custom role and user 
    RoleActions roleActions = new RoleActions(); 
    roleActions.AddUserAndRole(); 
} 

AdminApi:

[Authorize(Roles = "admin")] 
public class AdminApiController : ApiController 
{ 
    public string test() 
    { 
     return "test"; 
    } 

    [HttpPost] 
    public string DeleteUser(string id) 
    { 
     ApplicationDbContext db = new ApplicationDbContext(); 
     var user = db.Users.Find(id); 
     if (user != null) 
     { 
      string email = user.Email; 
      db.Users.Remove(user); 
      return "Succesfully deleted user : " + email; 
     } 
     else 
      return "Failed to delete user."; 
    } 
} 

Ajax:

function deleteUser (id) 
{ 
    $.ajax({ 
     url: '../api/AdminApi/DeleteUser', 
     type: 'POST', 
     contentType: "application/json", 
     dataType: 'json', 
     data: JSON.stringify(id), 
     success: function (data) { 
      alert(data); 
     }, 
     error: function (x, y, z) { 
      alert(x + '\n' + y + '\n' + z); 
     } 
    }); 
} 

Die Ajax-Funktion wird auf der Seite/Admin/AdminPage aufgerufen, um zur Web-API zu gelangen -> ../api/AdminApi und die Funktion zum Löschen von Benutzern lautet DeleteUser -> ../api/AdminApi/DeleterUser

Ich verstehe nicht, warum ich einen 404-Fehler bekomme. Ich kann verstehen, wenn meine Funktion DeleteUser nicht funktioniert, da ich es nicht getestet habe, aber ich kann es nicht testen, wenn ich nicht in der Funktion komme.

+0

Vorschlag löschen Operation in WEBAPI sollte "HttpDelete" vermeiden mit Post zum Löschen. – TusharJ

Antwort

1

Das Problem wird damit zusammen, wie Sie das Attribut verwenden:

[Route("DeleteUser")] 

Wenn Sie das Attribut Strecke verwenden. bei Methode Ebene, was tut es neue Route oder mehr Routen zu definieren, also so, wie Sie es ist wie [Route('Url/path1/route1')] verwenden sollen:

Als Beispiel dafür, wie es funktioniert:

//GET api/customer/GetMetaData 
[Route('/api/customer/GetMetaData')] 
public string Get2(){ 
     //your code goes here 
} 

Wenn Sie mehrere erklärt werden Routen in Ihrer Klasse, dann können Sie RoutePrefix Attribut wie [RoutePrefix('url')] auf Klassenebene verwenden. Dadurch wird eine neue Basis-URL für alle Methoden in der Controller-Klasse festgelegt.

Zum Beispiel:

[RoutePrefix("api2/some")] 
public class SomeController : ApiController 
{ 
    // GET api2/some 
    [Route("")] 
    public IEnumerable<Some> Get() { ... } 

    // POST api2/some/DeleteUser/5 
    [HttpPost] 
    [Route("DeleteUser/{id:int}")] 
    public Some DeleteUser(int id) { ... } 

} 

aktualisieren

von Standard-Web-API schaut auf die Routing-URL zuerst, was in Ihrer [Route] ist ich meine, und er versucht, sie gegen Ihren Beitrag entsprechen . Wenn Ihre Methode jedoch ein komplexes Objekt als Parameter hat, kann WebApi die Werte aus dem Anforderungs-URI nicht abrufen, da der Parameter ein komplexer Typ ist. Die Web-API verwendet einen Medientyp-Formatierer, um den Wert aus dem Anforderungshauptteil zu lesen.

Da Ihre string id ist kein komplexes Objekt und es ist Teil Ihrer Route WebApi erwartet es als Teil Ihrer URL nicht die Stelle. Versuchen Sie dies stattdessen:

+0

Sorry dafür @Dalorzo, die [Route ("DeleteUser")] war nur ein Test, nachdem es nicht funktionierte, vergaß es einfach vor dem Posten zu entfernen, funktionierte immer noch nicht ohne es und arbeitete immer noch nicht mit den verschiedenen vorgeschlagenen Routen. – iamanoob

+0

Versuchen Sie dies mit Ihrem Code 'DeleteUser ([FromBody] string id)' – Dalorzo

+0

es hat funktioniert .... Können Sie mir erklären, warum [FromBody] einen 404 Fehler behebt? PS: Sieht aus wie meine Löschung nicht funktioniert tho, wenn es Ihnen nichts ausmacht, einen kurzen Blick darauf zu werfen, es gibt "erfolgreich gelöscht den Benutzer" aber es erscheint immer noch beim Aktualisieren der Seite. – iamanoob