J'ai écrit un site qui utilise l'API Web ASP.NET MVC et tout fonctionne correctement jusqu'à ce que je le mette sur le serveur de transfert. Le site fonctionne bien sur mon ordinateur local et sur le serveur Web de dev. Les serveurs de développement et intermédiaires sont tous deux Windows Server 2008 R2.
Le problème est le suivant: le site fonctionne en principe, mais certains appels d'API utilisent la méthode HTTP PUT. Celles-ci échouent lors de la mise en scène d'un 404, mais fonctionnent bien ailleurs.
Le premier problème que j'ai rencontré et résolu était dans le filtrage des demandes. Mais toujours obtenir le 404.
J'ai activé le traçage dans IIS et j'obtiens le problème suivant.
168. -MODULE_SET_RESPONSE_ERROR_STATUS
ModuleName IIS Web Core
Notification 16
HttpStatus 404
HttpReason Not Found
HttpSubStatus 0
ErrorCode 2147942402
ConfigExceptionInfo
Notification MAP_REQUEST_HANDLER
ErrorCode The system cannot find the file specified. (0x80070002)
Les configs sont les mêmes sur dev et staging, en fait tout le site est une copie directe.
Pourquoi les GET et les POST fonctionneraient-ils, mais pas les PUT?
Le module web-dav est installé sur ces serveurs IIS et je parie que ce n'est pas nécessaire et qu'il a été installé car la personne qui l'installe a coché toutes les cases.
Il suffit de retirer web-dav de iis.
Vous pouvez également utiliser web.config pour supprimer le module web dav:
<system.webServer>
<modules>
<remove name="WebDAVModule" />
</modules>
...
Pour ceux d'entre vous qui n'ont pas activé WebDAV mais qui rencontrent encore ce problème en utilisant l'API Web de MVC 4 ...
Steve Michelotti a documenté une solution qui a fonctionné pour moi ici .
À la fin de la journée, j'ai activé tous les verbes (verb = "*") du gestionnaire ExtensionlessUrlHandler-Integrated-4.0 dans ma configuration Web.
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true" />
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
Cela semble être dû à plusieurs raisons. Aucune de ce qui précède n'a vraiment fonctionné pour moi. J'avais déjà les paramètres ExtensionlessUrlHandler dans web.config avec tous les verbes HTTP requis. Finalement, j'ai dû apporter les modifications suivantes à IIS:
Handler Mappings
.ExtensionlessUrlHandler-ISAPI-4.0_32bit
et double-cliquez surRequest Restrictions
.PUT
et DELETE
Ok
si nécessaire et répondez Yes
dans la boîte de dialogue Edit Script Map
qui apparaît.ExtensionlessUrlHandler-ISAPI-4.0_64bit
J'espère que ça aide quelqu'un :)
Mon hébergeur ne peut PAS désinstaller WebDAV car cela affecterait tout le monde.
Ceci, runAllManagedModulesForAllRequests = "true", fonctionnait mais n'était pas recommandé.
De nombreuses corrections incluaient la suppression du module pour WebDAVModule mais cela ne fonctionnait toujours pas. J'ai également supprimé le gestionnaire et, enfin, je pouvais utiliser tous les verbes POST GET PUT DELETE.
Supprimez WebDAVModule et WebDAV dans les modules et les gestionnaires.
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
J'ai corrigé cette suppression du filtre ISAPI UrlScan
Dans mon cas, aucune de ces solutions ne s’appliquait.
Je l'ai corrigé en modifiant le pool d'applications en Integrated au lieu de Classic.
Le gestionnaire:
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
ne va pas fonctionner avec un pool d'applications Classic, car sa preCondition
est integratedMode
.
Rick Strahl de West-Wind a recommandé ce qui suit:
<gestionnaires> <remove name = "ExtensionlessUrlHandler-Integrated-4.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" /> </handlers>Ce qui a très bien fonctionné pour moi.
J'ai résolu ce problème en modifiant le pool d'applications du site Web en mode intégré alors qu'il était auparavant en mode classique.
Salut Pour moi, aucune des solutions n'a fonctionné. J'ai finalement réussi à faire ça:
1) Dans IIS, sélectionnez votre application.
2) Aller sur Demande de filtrage
3) Puis sélectionnez l'onglet HTTP Verbs
4) J'ai trouvé le verbe PUT et d'autres verbes autoriser la valeur false, mais je ne pouvais pas simplement éditer. . Entrez le verbe avec lequel vous avez des problèmes et voilà!
J'espère que cela aidera quelqu'un !