j'essaie de comprendre comment IIS 7.5 gère les demandes POST et PUT.
J'écris un service RESTful en utilisant le framework OpenRasta. L'opération POST fonctionne sans problème, mais l'opération PUT pour la même URL ne fonctionne pas. Il retourne une erreur comme celle-ci
Detailed Error Information
Module: IIS Web Core
Notification: MapRequestHandler
Handler: StaticFile
Error Code: 0x80070002
l'url est comme ceci après "http: //localhost/MyService/Resource.Something.manifest"
Même configuration fonctionne bien dans le développement de studio visuel IIS.
Solution
Fondamentalement, ExtensionlessUrlHandler par défaut n'accepte pas les verbes PUT et DELETE. Juste besoin de les ajouter.
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
Pour que PUT et DELETE soient acceptés par IIS 7.5 avec une API PHP 5.4 fast-CGI REST, je devais désactiver le module WebDAV. Sinon, le module WebDAV intervient dans les requêtes HTTP à l'aide de PUT ou DELETE. Pour que cela fonctionne était cependant un peu déroutant et j'ai peut-être manqué certaines étapes ou l'ai fait dans un autre ordre.
Ces lignes sont placées en tant qu'enfants de l'élément <system.webServer>
- dans web.config à la racine de l'application.
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
J'espère que cela évitera une certaine frustration. Il semble que le paramètre par défaut du serveur accepte tout verbe HTTP non répertorié - voir les paramètres sous Request filtering -> HTTP Verbs -> Edit feature Settings
. On peut envisager d'ajouter explicitement les VERBES à autoriser. Les verbes autorisés peuvent être spécifiés en ajoutant cet extrait, également en tant qu'enfant de <system.webServer>
.
<security>
<requestFiltering>
<verbs allowUnlisted="false">
<add verb="GET" allowed="true" />
<add verb="POST" allowed="true" />
<add verb="DELETE" allowed="true" />
<add verb="PUT" allowed="true" />
</verbs>
</requestFiltering>
</security>
Sur un ordinateur client, vous pouvez désinstaller le module WebDAV à partir d’ici:
Control Panel -> Uninstall Program -> Turn Windows features on or off -> IIS -> World Wide Web Services -> Common HTTP feautre -> WebDAV Publishing
La dernière mesure pour que cela fonctionne est en éditant applicationhost.config
trouvé dans C:\Windows\System32\inetsrv\config
. Dans <system.webServer> -> <handlers>
, vous verrez une entrée php ne contenant que verb="GET,HEAD,POST
- modifiez-la pour ajouter les verbes dont vous avez besoin, par exemple:
<add name="PHP54_via_FastCGI" path="*.php" verb="GET,HEAD,PUT,DELETE,POST"/>
|
|
|
append verbs here ----------------------------------------------|
1.Accédez à IIS Manager.
2.Cliquez sur votre application.
3.Allez dans "Mappages de gestionnaires".
4.Dans la liste des fonctionnalités, double-cliquez sur "WebDAV".
5.Cliquez sur "Demander des restrictions".
6.Dans l'onglet "Verbes", sélectionnez "Tous les verbes".
7. Appuyez sur OK.
Voir http://learn.iis.net/page.aspx/901/iis-express-faq/ qui est lié à partir du wiki OR.
À partir du lien (non cité en bloc pour la lisibilité):
R: Vous pouvez modifier le IIS Express applicationHost.config
dans le dossier %userprofile%\documents\IISExpress\config
. Par exemple, pour activer PUT et DELETE pour les URL sans extension, faites défiler vers le bas du fichier IIS Express applicationHost.config
et recherchez une entrée de gestionnaire commençant par:
<add name="ExtensionlessUrl-Integrated-4.0"
…
Dans l'attribut verb
, ajoutez PUT
et DELETE
afin que l'attribut verb
ressemble à: verb="GET,HEAD,POST,DEBUG,PUT,DELETE"
.
Mon scénario était une application Web sur un site Web sur IIS 7.5. Le site Web devait continuer d'activer WebDAV, mais l'application Web devait le désactiver pour prendre en charge PUT et DELETE dans son API REST.
Pour que cela fonctionne, le fichier Web.config de l'application Web avait besoin de ceci:
<modules runAllManagedModulesForAllRequests="true" runManagedModulesForWebDavRequests="true" >
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
La différence importante par rapport aux autres réponses ici est la nécessité de runManagedModulesForWebDavRequests = "true"
Pour moi cela fait l'affaire dans le web.config.
<system.webserver>
<handlers>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" modules="IsapiModule" scriptProcessor="c:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
<system.webserver/>
<system.web>
<authentication mode="Windows" />
<identity impersonate="true"/>
<system.web/>
J'ai utilisé la configuration suivante:
- IIS 7.5
- Windows Server 2008 R2
- Pool d'applications personnalisé, .NET 4.0, intégré
- Authentification Windows = true
- Authentification anonyme = false
J'espère que ça aide. ;-)
Si les autres réponses ne fonctionnent toujours pas et que vous obtenez l'erreur 404: ces verbes peuvent être explicitement rejetés par l'outil URLScan, si vous l'avez installé.
Vous pouvez configurer les sections [AllowVerbs]
et [DenyVerbs]
du fichier URLScan.ini
pour répondre à vos besoins.
Méfiez-vous des risques pour la sécurité de l'activation de ces verbes.
Ce qui a fonctionné pour moi, c’est la désinstallation complète de WebDav.
Entrer dans les mappages de gestionnaires et configurer WebDAV pour gérer tous les verbes est la seule chose qui a fonctionné pour moi, malgré le fait que PUT
et DELETE
étaient déjà répertoriés comme verbes gérés. Le web.config de travail que j'ai est:
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<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" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
<remove name="WebDAV" />
<add name="WebDAV" path="*" verb="*" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />
</handlers>
</system.webServer>
J'ai essayé dans IIS 8.
** désinstaller WebDav Publishing
Procédure de désinstallation -> Panneau de configuration -> Accédez à Programmes et fonctionnalités -> Activer ou désactiver les fenêtres Featues -> Sélectionnez Internet Information Services-> World Wide Services Web-> Fonctionnalités HTTP communes-> "Supprimer" la publication WebDAV en décochant l'option WebDAV **
dans le web.config
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
vous pouvez également utiliser l'interface utilisateur de gestion IIS et le définir globalement, ou le serveur Web par défaut
Raison de l'erreur 500!
Salut à tous,
Je veux aussi publier mes propres recherches, j'espère que cela aiderait les futurs passionnés . Comme suggéré dans les réponses, je ne peux pas désinstaller WebDav. J'ai donc ajouté la ligne ci-dessous dans la configuration Web (à partir d'autres réponses).
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
mais j'ai eu une erreur 500, quand j'ai activé le mode débogage trouvé ceci
Cannot add duplicate collection entry of type 'add' with unique key attribute 'name' set to 'ExtensionlessUrlHandler-Integrated-4.0'
Réponse
C'est parce qu'il y avait déjà un ExtensionlessUrlHandler dans la section Mappages de gestionnaires, procédez comme suit pour résoudre le problème.
Méthode 1
1) Accédez à votre gestionnaire IIS et sélectionnez votre application.
2) Aller à la fonctionnalité Mappages de gestionnaires
3) Recherchez ExtensionlessUrlHandler-Integrated-4.0 et supprimez-le.
4) Ajouter ExtensionlessUrlHandler dans votre configuration Web (comme indiqué dans les réponses ci-dessus)
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
Méthode 2
1) Supprimer le gestionnaire ExtensionlessUrl de votre configuration Web
2) Cliquez sur votre application dans IIS Server, accédez à HandlerMappings.
3) Trouver ExtensionlessUrlHandler-Integrated-4.0 (seulement ce nom, ignorer les autres)
4) faites un clic droit dessus et choisissez Modifier
5) cliquez sur 'Demander des restrictions' et sélectionnez l'onglet Verbes et choisissez Tous les verbes
cela permettra au gestionnaire sans extensions d'autoriser tous les verbes.
J'irai avec la méthode 1, car nous pouvons avoir le contrôle dans web.config. Mais assurez-vous que Vérifie le serveur de déploiement pour les définitions de gestionnaire en double.
Dans Windows Server 2012 . Ouvrez applicationHost.config fichier dans le bloc-notes avec droits d'administrateur
applicationHost.config le fichier se trouve dans C:\Windows\System32\inetsrv\config
Localiser la section
<verbs allowUnlisted="false" applyToWebDAV="true">
<add verb="GET" allowed="true" />
<add verb="HEAD" allowed="true" />
<add verb="POST" allowed="true" />
<add verb="DELETE" allowed="false" />
<add verb="TRACE" allowed="false" />
<add verb="PUT" allowed="false" />
<add verb="OPTIONS" allowed="false" />
</verbs>
Avis DELETE et PUT HTTP Les verbes sont définis sur false. Changez les en vrai.
Il devrait maintenant se lire comme ci-dessous
<verbs allowUnlisted="false" applyToWebDAV="true">
<add verb="GET" allowed="true" />
<add verb="HEAD" allowed="true" />
<add verb="POST" allowed="true" />
<add verb="DELETE" allowed="true" />
<add verb="TRACE" allowed="false" />
<add verb="PUT" allowed="true" />
<add verb="OPTIONS" allowed="false" />
</verbs>
Enregistrez le fichier. Vous avez activé les requêtes HttpPut et HttpDelete sur votre serveur Web.
Mon web.config avec asp.net core 1.0
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
</handlers>
<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/>
</system.webServer>
</configuration>