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?