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.
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
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>
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 .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
.
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;
}
}
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" />
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.
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.
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>
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
}
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)
{
...
}
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>
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