HTTP PUT nie jest dozwolony w ASP.NET Web API

W moim projekcie Web API nie mogę wykonaćHTTP PUT do moich zasobów. Przeczytałemtrochę podobny pytania na to problem i zastosowałem się do zalecanej porady.

Po pierwsze, całkowicie odinstalowałem WebDAV na moim komputerze (64-bitowy Windows 7), a następnie ponownie uruchomiłem komputer.

Po drugie, procedury obsługi WebDAV zostały określone jako usunięte w moimweb.config iHTTP PUT czasownik został określony jako dozwolony dla programu obsługi URL bez rozszerzeń.

<modules runAllManagedModulesForAllRequests="false">
  <remove name="WebDAVModule"/>
</modules>

<handlers>
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <remove name="WebDAV"/>
  <add name="ExtensionlessUrlHandler-Integrated-4.0"
       path="*."
       verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS"
       type="System.Web.Handlers.TransferRequestHandler"
       resourceType="Unspecified"
       requireAccess="Script"
       preCondition="integratedMode,runtimeVersionv4.0" />
  <add name="AttributeRouting" path="routes.axd" verb="*" type="AttributeRouting.Web.Logging.LogRoutesHandler, AttributeRouting.Web" />
</handlers>

Próbowałem nawet dodać ISAPI Extensionless URL Handler (32-bitowy i 64-bitowy) i zmienić moją aplikację ze zintegrowanego potoku aplikacji Pool na klasyczną pulę aplikacji.

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

Obecnie używamThinktecture IdentityModel aby włączyć obsługę współdzielenia zasobów Cross Origin Resource Sharing (CORS). Ze względu na mój rozsądek poszedłem z nuklearną opcją włączenia wszystkiego, aby upewnić się, żeHTTP PUT jest rzeczywiście dozwolone.

config.RegisterGlobal(httpConfig);

config.ForAllResources()
      .ForAllOrigins()
      .AllowAllMethods()
      .AllowAllRequestHeaders();

TheRouting atrybutów Pakiet NuGet jest skonfigurowany do pobierania wszystkich tras z bieżącego zespołu i wszelkich podtypówApiController.

config.AddRoutesFromAssembly(Assembly.GetExecutingAssembly());
config.AddRoutesFromControllersOfType<ApiController>();

Mój zasób maPUT poprawnie określony atrybut.

[PUT("/API/Authenticate/Link/{key}/{identifier}")]
public Boolean LinkUser(Guid key, String identifier) { ... }

Każdy zasób, który sprawdzam w tej kwestii, zaleca dokładnie to samo: Odinstalowanie WebDAV, wyłączenie procedur obsługi WebDAV i upewnienie się, że obsługa adresów URL Extensionless jest poprawnie skonfigurowana. Zrobiłem to wszystkonadal nie działa.

W skrzypku otrzymuję:

PUT https://localhost/Test/API/Authenticate/Link/Foo/Bar

{"Message":"The requested resource does not support http method 'PUT'."}

Co ja robię źle?

questionAnswers(6)

yourAnswerToTheQuestion