web-dev-qa-db-fra.com

L'API Web ASP.NET renvoie 404 pour PUT uniquement sur certains serveurs

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?

30
Greg Bacchus

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>
    ...
25
Aliostad

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>
45
Kevin Ortman

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:

  • Dans IIS, sélectionnez votre site Web et double-cliquez sur Handler Mappings.
  • Trouvez ExtensionlessUrlHandler-ISAPI-4.0_32bit et double-cliquez sur
  • Dans la boîte de dialogue qui apparaît, cliquez sur Request Restrictions.
  • Sur l'onglet Verbes, ajoutez les verbes HTTP manquants, séparés par des virgules (dans mon cas, il s'agissait de PUT et DELETE
  • Cliquez sur Ok si nécessaire et répondez Yes dans la boîte de dialogue Edit Script Map qui apparaît.
  • Répéter pour ExtensionlessUrlHandler-ISAPI-4.0_64bit

J'espère que ça aide quelqu'un :)

12
wingyip

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>
5
Stanomatic

J'ai corrigé cette suppression du filtre ISAPI UrlScan

4
pomber

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.

4
toddmo

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.

1
RickIsWright

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. 

0
James Hay

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 !

0
user2736265