10

Mam rozwiązanie VS2012 MVC4, w którym testuję kontrolery Web API.Asp.Net MVC4 + Web API Kontroler Usuń żądanie >> Błąd 404

Pomyślnie przetestowałem GET, POST, PUT, ale DELETE nadal daje mi błąd http 404. Kiedy ustawiam punkt przerwania w mojej akcji "DeleteMovie" w moim kontrolerze api, punkt przerwania nigdy nie zostanie osiągnięty.

Przeczytałem wiele postów na temat tego problemu, ale nikt mi nie pomógł.

Oto mój API Kontroler DELETE:

[HttpDelete] 
    public HttpResponseMessage DeleteMovie(int id) 
    {  
     // Delete the movie from the database  
     // Return status code  
     return new HttpResponseMessage(HttpStatusCode.NoContent); 

    } 

Oto moja strona html:

<script type="text/javascript"> 

    deleteMovie(1, function() 
    { 
     alert("Movie deleted!"); 
    }); 

    function deleteMovie(id, callback) { 
     $.ajax({ 
      url: "/api/Movie", 
      data: JSON.stringify({ id: id }), 
      type: "DELETE", 
      contentType: "application/json;charset=utf-8", 
      statusCode: { 
       204: function() { 
        callback(); 
       } 
      } 
     }); 
    } 

</script> 

Moja klasyczny trasa jest następująca:

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

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

My routingu API jest następujące:

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

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

W moich właściwości roztworu, ja skonfigurować 'Użyj lokalnego serwera IIS Web' z 'Korzystanie z usług IIS Express' sprawdzony

Próbowałem też z 'Korzystanie z programu Visual Studio Development Server', ale ten sam problem.

Każdy pomysł?

Dzięki.

+0

W przeglądarce, jeśli użyć narzędzi debugowania, można uchwycić URL, który faktycznie staje emitowanego przez jQuery i zobaczyć, czy wygląda na zdrowe? –

Odpowiedz

16

HTTP DELETE nie ma treści. Musisz przekazać identyfikator jako parametr ciągu zapytania.

+1

Dziękuję. Masz rację! Znalazłem kod na blogu tutaj: http://stephenwalther.com/archive/2012/03/05/introduction-to-the-asp-net-web-api.aspx Więc naprawdę nie myślę o taki problem! – Bronzato

33

Jeśli błąd otrzymujesz jest html typ zawartości z IIS, błąd 404,0

Upewnij się, że rozdział w swoim web.config, która jest dodawana przez szablon Web API. Domyślnie usługi IIS nie obsługują komendy DELETE, a ta konfiguracja zastępuje zachowanie.

<system.webServer> 
    <handlers> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
     <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" /> 
    </handlers> 
    </system.webServer> 
+1

+1 Zacząłem od projektu MVC, ale chciałem go tylko dla WebAPI. Więc po usunięciu tego, co uważałem za konfigurację specyficzną dla MVC, moje żądania DELETE wynosiły 404. Dzięki. –

0

Według odpowiedzi przez Russella Wziąłem spojrzeć w web config i znalazł dwie linie w metodzie Ładowarki

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

Usunąłem ostatni i to działało.

tylko przykład wykorzystania na kliencie (maszynopis)

public deleteComment(commentId: number) { 
     var url = 'api/comments/' + commentId; 
     return this.$http.delete(url); 
    } 

i serwer boczne

[Route("{id:int}")] 
    public async Task<IHttpActionResult> Delete(int id){ 
     await _snippetService.DeleteComment(id); 
     return Ok(); 
    }