Web API - Probleme mit WebDav

Betreibt man ein ASP.NET Web Api Http-Backend zusammen mit WebDAV auf der gleichen IIS-Instanz, kann es zu Problemen mit Http-Put oder Http-Delete Requests kommen.

Die folgende AngularJS-App löste bei jedem PUT oder DELETE Request einen HTTP Error 401.0 - Unauthorized Fehler aus.

(function () {
  "use strict";

  angular.module("myApp").controller("shellController", shellController);

  shellController.$inject = ["$scope", "$http"];

  function shellController($scope, $http) {
    $scope.doPut = function () {
      $http
        .put("/api/myapp")
        .success(function (data) {
          $scope.result = data;
        })
        .error(function (error, status) {
          console.error(error);
        });
    };
  }
})();

Im Detail ist zu sehen, dass das WebDAVModule offenbar ein Problem mit dem Request hat. Dasselbe Resultat erhalte ich auch bei einem Delete-Request.

In diversen Foren (hier oder hier) wird vorgeschlagen, das WebDAVModule mit Hilfe der web.config zu entfernen, oder WebDAV komplett zu entfernen.

   <system.webServer>

      <httpErrors errorMode="Detailed"/>

      <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>

    </system.webServer>

Leider ohne Erfolg. IIS liefert immer noch einen 500 Error zurück.

Besonders problematisch in meinem Fall ist die Tatsache, dass das Http-Backend auf einem Shared-Hoster läuft und der Zugriff auf die IIS Konfiguration somit eingeschränkt ist. Aus diesem Grund ist die Deinstallation von WebDAV gar nicht möglich, da ich sowieso keinen Zugriff auf das Betriebssystem habe.

Ein paar Google-Abfragen später brachte mich dieser Post bei StackOverflow auf die richtige Lösung. In der Modules-Section musste lediglich das Attribut runManagedModulesForWebDavRequests auf true gesetzt werden und schon läuft alles wunderbar :-)

    <system.webServer>
      <httpErrors errorMode="Detailed"/>
      <modules runAllManagedModulesForAllRequests="true" runManagedModulesForWebDavRequests="true" />
      <handlers>
          <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>
    </system.webServer>