WebAPI Delete nie działa - metoda 405 niedozwolona

Doceniam każdą pomoc w tej sprawie, ponieważ strona ma zostać uruchomiona dziś wieczorem!

Mam kontroler web api z metodą Delete. Metoda działa poprawnie na moim lokalnym komputerze z systemem IIS Express (Windows 8), ale jak tylko wdrożyłem ją do serwera IIS na żywo (Windows Server 2008 R2), przestała działać i wyświetla następujący komunikat o błędzie: {]}

Błąd HTTP 405.0 - metoda niedozwolona Strona, której szukasz, nie może zostać wyświetlona, ponieważ nieprawidłowa metoda (czasownik HTTP) jest używany

Rozejrzałem się po sieci w poszukiwaniu rozwiązań i wdrożyłem najbardziej rozsądne. Mój web config ma następujące ustawienia:

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
<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>

Próbowałem również zmienić mapowania obsługi i Filtrowanie żądań w IIS bez skutku. Należy pamiętać, że zasady tworzenia WebDAV w IIS wydają się być wyłączone.

Wszelkie pomysły będą bardzo mile widziane Dzięki.

Author: Konrad Kokosa, 2013-03-25

12 answers

W końcu znalazłem rozwiązanie! Jeśli natkniesz się na ten sam problem, dodaj następujące elementy do swojej sieci.config

<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/> <!-- ADD THIS -->
    </modules>
    ... rest of settings here

Mam nadzieję, że to pomoże

 166
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-20 20:37:29

W niektórych przypadkach usunięcie go tylko z modułów może spowodować następny błąd:

500.21 Obsługa "WebDAV" ma zły moduł "WebDAVModule" na liście modułów

Moduł: IIS Web Core Notification: ExecuteRequestHandler "

Rozwiązanie zostało zaproponowane tutaj . Należy również usunąć go z uchwytów.

<system.webServer>
    <modules>
        <remove name="WebDAVModule" />
    </modules>
    <handlers>
        <remove name="WebDAV" />
    </handlers>
</system.webServer>
 46
Author: aleha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:56

W moim przypadku żadne z powyższych rozwiązań nie działało. To dlatego, że zmienił nazwę parametru w mojej metodzie Delete.

Miałem

public void Delete(string Questionid)

Zamiast

public void Delete(string id)

Muszę użyć nazwy id, ponieważ jest to nazwa, która jest zadeklarowana w moim pliku WebApiConfig. Zwróć uwagę na nazwę id w trzeciej i czwartej linijce:

            config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
Mam To rozwiązanie z tutaj .
 28
Author: Hugo Nava Kopp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-19 10:38:19

Javascript dla HTTP DELETE czasownik musi być taki:

$.ajax({
    **url: "/api/SomeController/" + id,**
    type: "DELETE",
    dataType: "json",
    success: function(data, statusText) {
        alert(data);
    },
    error: function(request, textStatus, error) {
        alert(error);
        debugger;
    }
});

Do a nie użyj czegoś takiego:

...
data: {id:id}
...

Jak wtedy, gdy używasz metody POST.

 12
Author: Pavel Kharibin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-23 21:18:01

Też miałem ten sam problem, dzwonię do WebAPi i dostaję ten błąd. Dodanie następującej konfiguracji w web.config for services solved my problem

    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/> <!-- add this -->
    </modules>

W sieci.plik konfiguracyjny rozwiązał mój problem. Tak właśnie dzwoniłem od strony klienta

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri(environment.ServiceUrl);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    HttpResponseMessage response = client.DeleteAsync("api/Producer/" + _nopProducerId).Result;
    if (response.IsSuccessStatusCode)
    {
        string strResult = response.Content.ReadAsAsync<string>().Result;
    }
}
 3
Author: Aamir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-20 02:45:01

Przejdź do applicationHost.config (zwykle pod C:\Windows\System32\inetsrv\config) file and comment out the following line in applicationHost.config

1) pod :

<add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />

2) skomentuj również następujący moduł, o którym mowa powyżej w

<add name="WebDAVModule" />
 1
Author: arviman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-08 11:59:16

Miałem błąd 405 metoda nie jest dozwolona, ponieważ pominąłem, aby usunąć metodę na kontrolerze WebApi publiczne.

Zajęło mi dużo czasu, aby znaleźć to (zbyt długo!) ponieważ spodziewałbym się, że w tym przypadku błąd nie został znaleziony, więc błędnie zakładałem, że moja metoda Delete została odrzucona.

Powodem nie wolno zamiast nie znaleziono jest to, że miałem również metodę Get dla tej samej trasy (co będzie normalnym przypadkiem przy implementacji REST). The public Get funkcja jest dopasowywana przez routing, a następnie odrzucana z powodu niewłaściwej metody http.

Prosty błąd, który znam, ale może zaoszczędzić komuś więcej czasu.

 1
Author: Paul D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-24 12:19:18

Tylko dodać. Jeśli to jest Twój config

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

Proszę robić tak jak powiedział Hugo i nie ustawiać atrybutu Route do metody Controller get, to dało problem w moim przypadku.

 1
Author: user6247020,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-24 09:42:27

Po wypróbowaniu prawie wszystkich rozwiązań tutaj to działało dla mnie. Dodaj to do pliku konfiguracyjnego API

<system.webServer>
    <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>
    <modules>
        <remove name="WebDAVModule" />
    </modules>
</system.webServer>
 1
Author: Nithin Chandran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-20 13:51:53

[HttpPost] atrybut na górze metody Delete rozwiązał ten problem dla mnie:

[HttpPost]
public void Delete(int Id)
{
  //Delete logic
}
 0
Author: Andriy Gubal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-26 07:54:57

Miałem podobny problem, ale dla PUT-żadna z innych sugestii nie zadziałała dla mnie.

Jednak używałem int zamiast domyślnego string dla id. dodanie {id:int} do trasy rozwiązało mój problem.

    [Route("api/Project/{id:int}")]
    public async Task<IHttpActionResult> Put(int id, [FromBody]EditProjectCommand value)
    {
       ...
    }
 0
Author: Hath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-20 12:24:35

Musieliśmy dodać niestandardowe nagłówki do naszej sieci.config jako nasze żądanie miało wiele nagłówków, które myliły odpowiedź API.

<httpProtocol>
    <customHeaders>
        <remove name="Access-Control-Allow-Methods" />
        <remove name="Access-Control-Allow-Origin" />
        <remove name="Access-Control-Allow-Headers" />
    </customHeaders>
</httpProtocol>
 0
Author: Zadok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-31 20:47:40