В моем проекте веб-API я не могу выполнить HTTP PUT
для своих ресурсов. Я прочитал несколько похожих questions on проблема, и я следил за рекомендациями.
Во-первых, я полностью удалил WebDAV на своей машине (Windows 7 64-bit) и впоследствии перезагрузил свою машину.
Во-вторых, обработчики WebDAV были указаны как удаленные в моем web.config
, а глагол HTTP PUT
был указан как разрешенный для обработчика URL без расширения.
<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>
Я даже попробовал добавить обработчик URL-адресов без привязки ISAPI (32-разрядный и 64-разрядный) и сменить приложение из интегрированного пула приложений в классический пул приложений.
<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" />
В настоящее время я использую Thinktecture IdentityModel, чтобы включить поддержку Cross Origin Resource Sharing (CORS). Для моего здравомыслия я пошел с ядерным вариантом, позволяющим всем, чтобы убедиться, что HTTP PUT
действительно разрешено.
config.RegisterGlobal(httpConfig);
config.ForAllResources()
.ForAllOrigins()
.AllowAllMethods()
.AllowAllRequestHeaders();
Маршрутизация атрибутов Пакет NuGet настроен на выбор всех маршрутов из текущей сборки и любых подтипов ApiController
.
config.AddRoutesFromAssembly(Assembly.GetExecutingAssembly());
config.AddRoutesFromControllersOfType<ApiController>();
В моем ресурсе также правильно указан атрибут PUT
.
[PUT("/API/Authenticate/Link/{key}/{identifier}")]
public Boolean LinkUser(Guid key, String identifier) { ... }
Каждый ресурс, который я ищу по этому вопросу, рекомендует то же самое: удалить WebDAV, отключить обработчики WebDAV и убедиться, что обработчик URL без расширения настроен правильно. Я сделал все это, и он еще не работает.
В fiddler я получаю следующее:
PUT https://localhost/Test/API/Authenticate/Link/Foo/Bar
{"Message":"The requested resource does not support http method 'PUT'."}
Что я делаю неправильно?