2016-06-22 3 views
1

Привет, я пытаюсь удалить запись (HttpDelete). Метод в контроллере не запускается и не получает ошибку 405 Method Not Allowed.WEB API2/HTTP DELETE не запускается - ошибка 405

JQuery ниже

function deleteContract(contractId) { 
      var contract = new Object(); 
      contract.ContractID = "ContractId"; 
      $.ajax({ 
       async: true, 
       type: 'DELETE', 
       data: contract, 
       dataType: "json", 
       url: 'http://localhost:4233/api/Contract/DeleteContractById/' + contractId, 
      }).done(function (data, textStatus, xhr) { 
       alert("deleted successfully") 
      }).error(function (jqXHR, textStatus, errorThrown) { 
       alert(jqXHR.responseText || textStatus); 
      }) 
     } 

контроллер ниже

// DELETE: api/Contract/5 
    [ResponseType(typeof(Contract))] 
    [AllowAnonymous] 
    [HttpDelete] 
    [ActionName("DeleteContractById")] 
    //[Route("api/Contract/{id}")] 
    [AcceptVerbs("DELETE")] 
    public HttpResponseMessage DeleteContract(Guid id) 
    { 
     Contract contract = db.Contract.Find(id); 
     if (contract == null) 
     { 
      return Request.CreateResponse(HttpStatusCode.NotFound); 
     } 

     db.Strata.Remove(contract); 
     db.SaveChanges(); 
     return Request.CreateResponse(HttpStatusCode.OK, contract); 
    } 

webapiconfig ниже

public static void Register(HttpConfiguration config) 
    { 
       config.SuppressDefaultHostAuthentication(); 
     config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 

       config.MapHttpAttributeRoutes(); 

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

    } 

веб-конфигурации ниже

<system.webServer> 
    <validation validateIntegratedModeConfiguration="false"/> 
    <modules runAllManagedModulesForAllRequests="true"> 
     <remove name="WebDAVModule"/> 
    </modules> 

    <handlers> 
    <remove name="WebDAV" /> 
     <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> 
    <httpProtocol> 
    <customHeaders> 
    <add name="Access-Control-Allow-Origin" value="*" /> 
    <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" /> 
    </customHeaders> 
</httpProtocol> 
    </system.webServer> 

, когда я делаю вызов, используя скрипт, который работает нормально. сообщите мне, если я пропустил какие-либо настройки в коде.

Благодаря Dev

+1

Возможный дубликат [ASP.NET Web API - PUT & DELETE Глаголы не разрешены - IIS 8] (http://stackoverflow.com/questions/10906411/asp-net-web-api-put-delete-verbs- not-allowed-iis-8) – Luke

+0

Пожалуйста, ознакомьтесь с этими существующими вопросами: http://stackoverflow.com/questions/10906411/asp-net-web-api-put-delete-verbs-not-allowed-iis- 8 http: // stackoverflow.com/вопросы/15619075/webapi-delete-not-working-405-method-not-allowed http://stackoverflow.com/questions/10906411/asp-net-web-api-put-delete-verbs-not-allowed -iis-8 – Luke

+0

У меня была эта проблема раньше, и я _disabled_ WebDav для пула приложений, на котором был размещен мой веб-сайт. – Luke

ответ

0

Вы пробовали использовать синтаксис асинхронной? Например

public async Task<HttpResponseMessage> DeleteStrata(Guid id) 
... 
await db.SaveChangesAsync() 
+1

Добро пожаловать в переполнение стека! Пожалуйста, добавьте некоторое объяснение, почему этот код помогает OP. Это поможет обеспечить ответ, о котором могут узнать будущие зрители. См. [Ответ] для получения дополнительной информации. –

+1

Ошибка в методе 405 не допускается. Сервер активно отказывается от соединения. К сожалению, изменение этого параметра в Async не решит эту проблему, чтобы позволить серверу принимать HTTP-запрос с помощью HTTP-команды DELETE. – Luke

+0

Извините за поздний ответ. Подумайте, мое предложение было не очень продуманным. Теперь я не думаю, что это поможет. Проблема лежит где-то в другом месте, и я не знаю, где. Сожалею. –

0

У меня есть 405, когда метод, который я использовал, не был тем, что ожидал API. И я заметил кое-что, хотя я не уверен, что это основные проблемы:

  1. Название действия на API написано с ошибками, он должен быть DeleteContractById (он имеет договор вместо договора).
  2. Функция deleteContract передает тело. Метод API не ожидает тела (данных).
  3. Маршрут предназначен для ожидания идентификатора GUID. Является ли значение ContractId переданным в deleteContract действительным GUID?
+0

Я исправил орфографическую ошибку «deleteecontractbyid». в исходном коде его правильно. –

0

Мы нашли решение, делая ниже изменения

web.config

<customHeaders> 
    <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" /> 
    <add name="Access-Control-Request-Headers" value="*" /> 
    <add name="Access-Control-Allow-Headers" value="*" /> 
</customHeaders> 

Startup.Auth.cs

Объявить ниже уровня класса

[EnableCors(origins: "http://localhost:49369", headers: "*", methods: "*", exposedHeaders: "X-Custom-Header")] 
public void ConfigureAuth(IAppBuilder app) 
{ 
    app.UseCors(CorsOptions.AllowAll); // newly added this require to "Install-Package Microsoft.Owin.Cors" 
} 

Контроллер

[EnableCors(origins: "http://localhost:49369", headers: "*", methods: "*", exposedHeaders: "X-Custom-Header")] 
public class ContractController : ApiController 
{ 
} 

WebApi.config

public static class WebApiConfig 
{ 

    public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 
     // Configure Web API to use only bearer token authentication. 

     config.SuppressDefaultHostAuthentication(); 
     config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     // Controllers with Actions 
     // To handle routes like `/api/VTRouting/route` 
     config.Routes.MapHttpRoute(
      name: "ControllerAndAction", 
      routeTemplate: "api/{controller}/{action}/{id}", 
      defaults: new { action = "GET", id = RouteParameter.Optional } 
     ); 

    } 
} 

Это все, что начал работать.

+0

Я принимаю, что вы принимаете запросы GET, POST, PUT, DELETE, OPTIONS из других доменов, если вы разрешаете CORS? Если вы этого не сделаете, я не думаю, что вы должны его разрешить. – Luke

Смежные вопросы