Asp.Net MVC4 + Web API Controller Запрос на удаление ›› Ошибка 404

У меня есть решение VS2012 MVC4, в котором я тестирую контроллеры веб-API.

Я успешно протестировал GET, POST, PUT, но DELETE все еще вызывал у меня ошибку http 404. Когда я устанавливаю точку останова в своем действии «DeleteMovie» в моем контроллере API, точка останова никогда не достигается.

Я прочитал много сообщений об этой проблеме, но никто не помог мне.

Вот мой контроллер API для DELETE:

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

    }

Вот моя 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>

Мой классический маршрут выглядит следующим образом:

    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 }
        );
    }

Моя маршрутизация для API выглядит следующим образом:

    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 }
        );
    }

В свойствах моего решения я настраиваю «Использовать локальный веб-сервер IIS» с установленным флажком «Использовать IIS Express».

Я также пытался использовать «Использовать сервер разработки Visual Studio», но та же проблема.

Есть идеи?

Спасибо.


person Bronzato    schedule 28.02.2013    source источник
comment
В вашем браузере, если вы используете инструменты отладки, можете ли вы захватить URL-адрес, который фактически генерируется jQuery, и посмотреть, выглядит ли он нормально?   -  person Russ Clarke    schedule 28.02.2013


Ответы (4)


HTTP DELETE не имеет тела. Вам нужно передать идентификатор в качестве параметра строки запроса.

person Darrel Miller    schedule 28.02.2013
comment
Спасибо. Ты прав! Я нашел код в сообщении блога здесь: stephenwalther.com/archive/2012/03/05/ Так что я действительно не думаю о такой проблеме! - person Bronzato; 28.02.2013

Если ошибка, которую вы получаете, относится к типу содержимого html из IIS, ошибка 404.0

Убедитесь, что в файле web.config есть раздел, добавленный шаблоном Web Api. По умолчанию IIS не будет обслуживать команду DELETE, и эта конфигурация переопределяет поведение.

  <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>
person Russell Chadwick    schedule 26.04.2013
comment
+1 Я начал с проекта MVC, но хотел его только для WebAPI. Итак, после удаления того, что я считал специфичной конфигурацией MVC, мои запросы DELETE были 404. Спасибо. - person Luke Baulch; 30.05.2013

Наткнулся на 404, работающий на Mac, с помощью Dotnet Core.

В моем случае я изменил аннотацию атрибута с HttpDelete на HttpDelete("{id}").

person Jason Foglia    schedule 30.03.2019
comment
Хорошо знать. Спасибо, что поделился. - person Bronzato; 31.03.2019

Согласно ответу Рассела, я заглянул в веб-конфигурацию и нашел две строки в методе обработчиков.

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

Я удалил последнюю и все заработало.

Просто пример использования на клиенте (машинопись)

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

и серверная часть

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