W moim projekcie interfejsu API sieci Web nie mogę wykonać HTTP PUT
dla moich zasobów. Przeczytałem przez some thisproblem i zastosowałem się do zalecanej porady.HTTP PUT nie jest dozwolone w ASP.NET Web API
Po pierwsze, całkowicie odinstalowałem WebDAV na moim komputerze (Windows 7 64-bit), a następnie ponownie uruchomiłem komputer.
drugie, koparki WebDAV zostały określone jako usunięte w moim web.config
i HTTP PUT
czasownik został określony jako dozwolony dla bez rozszerzeń URL Handler.
<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 dodając URL bez rozszerzeń ISAPI Handler (32-bit i 64-bit) oraz zmianę mojej aplikacji z App Pool zintegrowanego rurociągu do klasycznej App Pool.
<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żywam Thinktecture IdentityModel włączyć Cross-Origin Resource Sharing (CORS) wsparcie. Jeśli chodzi o moje zdrowie psychiczne, wybrałem opcję jądrową, która umożliwi wszystko, aby upewnić się, że rzeczywiście jest dozwolona HTTP PUT
.
config.RegisterGlobal(httpConfig);
config.ForAllResources()
.ForAllOrigins()
.AllowAllMethods()
.AllowAllRequestHeaders();
Attribute Routing pakiet Nuget jest skonfigurowany do odbioru wszystkich tras z obecnej montażu i wszelkie podtypy ApiController
.
config.AddRoutesFromAssembly(Assembly.GetExecutingAssembly());
config.AddRoutesFromControllersOfType<ApiController>();
Mój zasób ma również poprawnie określony atrybut PUT
.
[PUT("/API/Authenticate/Link/{key}/{identifier}")]
public Boolean LinkUser(Guid key, String identifier) { ... }
Każdy zasób Patrzę na ten temat zaleca dokładnie taki sam rzecz: Odinstalowywanie WebDAV, wyłączanie ładowarki WebDAV i upewniając się, że procedura obsługi bez rozszerzeń URL jest prawidłowo skonfigurowany. Zrobiłem to wszystko i nie działa nadal.
W Skrzypek, Dostaję następujące:
PUT https://localhost/Test/API/Authenticate/Link/Foo/Bar
{"Message":"The requested resource does not support http method 'PUT'."}
Co robię źle?
że atrybut powinien być '[HttpPut]'? –
@dtryon: Nie. Pochodzi z 'AttributeRouting'. Powinien to być "[PUT (...)]". –
Miałem ten problem - było tak, ponieważ moja akcja kontrolera nie została poprawnie skonfigurowana - oczekiwał parametru, którego nie zawierałem. – niico