Nel mio progetto API Web, non è possibile eseguire uno HTTP PUT
alle risorse. Ho letto il numero somesimilarquestionsonthisproblem e ho seguito il consiglio consigliato.HTTP PUT non consentito nell'API Web ASP.NET
Prima di tutto, ho disinstallato WebDAV completamente sulla mia macchina (Windows 7 64-bit) e successivamente ho riavviato la mia macchina.
In secondo luogo, i gestori WebDAV sono stati specificati come rimossi nel mio web.config
e il verbo HTTP PUT
è stato specificato come consentito per il gestore di URL senza estensioni.
<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>
Ho anche provato ad aggiungere l'ISAPI senza estensione URL Handler (32-bit e 64-bit) e cambiare la mia applicazione dalla pipeline integrata App Pool al classico 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" />
Attualmente sto usando Thinktecture IdentityModel per abilitare il supporto Croce Origin Resource Sharing (CORS). Per la mia sanità mentale, sono andato con l'opzione nucleare di abilitare tutto per assicurarmi che il HTTP PUT
sia effettivamente permesso.
config.RegisterGlobal(httpConfig);
config.ForAllResources()
.ForAllOrigins()
.AllowAllMethods()
.AllowAllRequestHeaders();
Il Attribute Routing pacchetto NuGet è configurato per raccogliere tutte le rotte per il gruppo corrente ed eventuali sottotipi di ApiController
.
config.AddRoutesFromAssembly(Assembly.GetExecutingAssembly());
config.AddRoutesFromControllersOfType<ApiController>();
La mia risorsa ha anche l'attributo PUT
specificato correttamente.
[PUT("/API/Authenticate/Link/{key}/{identifier}")]
public Boolean LinkUser(Guid key, String identifier) { ... }
Ogni risorsa Guardo in materia raccomanda la stessa cosa esatta: disinstallazione WebDAV, disabilitando i gestori WebDAV e fare in modo che il gestore senza estensione URL sia configurato correttamente. Ho fatto tutto questo ed è ancora non funziona.
In violinista, sto ottenendo il seguente:
PUT https://localhost/Test/API/Authenticate/Link/Foo/Bar
{"Message":"The requested resource does not support http method 'PUT'."}
Che cosa sto facendo di sbagliato?
Questo attributo deve essere '[HttpPut]'? –
@dtryon: No. È da "AttributeRouting". Dovrebbe essere '[PUT (...)]'. –
Ho avuto questo problema - è stato perché l'azione del mio controller non è stata configurata correttamente - si aspettava un parametro che non includevo. – niico