Im Standardfall erlaubt der IIS keine Requests mit den HTTP Verben PUT & DELETE. Diese sind allerdings in einer REST Welt pflicht. Man kann nun im IIS rumdoktern und dort die beiden Verben aktivieren, allerdings habe ich solche Sachen als Entwickler lieber selbst in der Hand als dem Admin ein Handbuch zu schreiben ;)
Ziel ist es also, HTTP PUT & Delete über die Web.config zu aktivieren.
Web.config
Unter dem Konfigurationspunkt system.webServer können die entsprechenden Einstellungen gemacht werden:
<system.webServer> ... <modules runAllManagedModulesForAllRequests="true"> <remove name="WebDAVModule" /> ... </modules> <validation validateIntegratedModeConfiguration="false" /> <handlers> <remove name="WebDAV" /> <remove name="ExtensionlessUrlHandler-Integrated-4.0"/> <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> ... </handlers> </system.webServer>
Erklärung:
Wir entfernen den “ExtensionlessUrlHandler” (wenn die Anwendung im Integrated Modus läuft, dann ist es der ExtensionlessUrlHanler-Integrated – später dazu noch mehr) und fügen ihn darauf neu hinzu und erlauben neben den GET, HEAD, POST Verben noch PUT und DELETE. Ohne das entfernen, wäre der Eintrag zwei mal drin und der IIS würde eine Fehlerseite generieren.
Warum das entfernen von dem WebDav Modul wichtig ist
Wenn auf dem IIS noch das WebDav Feature aktiviert ist, dann muss man es für diese Seite deaktivieren, weil sowohl WebDav als auch unser eigentlicher REST Service sprechen auf dieselben Verben an.
Zu den Handlern
In meinem Fall habe ich nur den Handler, welcher für die “extensionless” Sachen notwendig ist freigeschalten. Alle Handler einer Webanwendung können im IIS unter Handler Mappings betrachtet werden:
Unter den Details können auch die “Request Restrictions” betrachtet werden:
Bei mir hat es jedenfalls mit der web.config Einstellung geklappt ;)
Als Abschluss noch der Hinweis für alle die sich fragen “Was ist eigentlich der Unterschied zwischen einem Modul und einem Handler?” – Hier die Antwort.