2017-05-24 2 views
0

Mon application de test a été développée en utilisant le modèle vide de l'application web Vs 2013 en utilisant Web Api.Web API 2 - Méthode IIS7 POST. 405 - non autorisé après avoir essayé toutes les solutions possibles

C'est ce que mon initialisation de routage ressemble:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 
     config.EnableCors(); 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 
    } 
} 

C'est ce que mon contrôleur ressemble à:

[EnableCors(origins: "*", headers: "*", methods: "*")] 
public class TestController : ApiController 
{ 
    [Route ("Test")] 
    [HttpGet] 
    public string Get() 
    { 
     return "Response to get Request"; 
    } 

    [Route("Test")] 
    [HttpPost] 
    public string Post(string text) 
    { 
     return string.Format("Received: '{0}'", text); 
    } 
} 

C'est ce que mon fichier web.config ressemble après y compris tous ont suggéré des corrections :

<system.web> 
    <compilation debug="true" targetFramework="4.5.1" /> 
    <httpRuntime targetFramework="4.5.1" /> 
    <webServices> 
    <protocols> 
     <add name="HttpGet" /> 
     <add name="HttpPost" /> 
     <add name="HttpPut" /> 
     <add name="HttpDelete" /> 
    </protocols> 
    </webServices> 
</system.web> 
<system.webServer> 
    <handlers> 
    <remove name="WebDAV" /> 
    <remove name="OPTIONSVerbHandler" /> 
    <remove name="TRACEVerbHandler" /> 
    <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" /> 
    </handlers> 
    <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> 

    <modules runAllManagedModulesForAllRequests="true"> 
    <remove name="WebDAVModule" /> 
    </modules> 
</system.webServer> 

J'ai vérifié les mappages de gestionnaire et le filtrage des demandes de mon application utilisant le gestionnaire IIS et le verbe POST apparaît comme activé.

J'ai tracé les demandes rejetées par ISS et je trouve que le ManagedPipeLineHandler définit l'erreur 405 comme on le voit ci-dessous:

ModuleName ManagedPipelineHandler

notification 128

httpStatus 405

Méthode HttpReason non autorisée

HttpSubStatus 0

ErrorCode 0

ConfigExceptionInfo

Avis EXECUTE_REQUEST_HANDLER

ERRORCODE L'opération terminée avec succès. (0x0)

Mon hypothèse est que la demande ne va pas à mon application. Ai-je raison? J'ai testé en utilisant Fiddler et j'ai trouvé que les en-têtes de réponse ont une section nommée 'Security' avec une seule ligne lisant 'Allow: GET', ce qui pourrait expliquer pourquoi Get fonctionne mais pas le POST.

D'où vient cette information? La réponse à cette question peut m'amener à une solution.

J'ai passé de nombreuses heures à essayer de résoudre ce problème sans aucune chance. Toute rétroaction sera grandement appréciée.

Répondre

0

J'ai supposé tout ce temps que le 'non autorisé' venait d'IIS, et il semble que j'avais tort.

La méthode My Post possède un paramètre de type string. Je supposais que, étant donné que mon attribut route ne contenait pas de paramètre vu ci-dessous, le paramètre serait extrait du corps de la requête.

[Route("Test")] 
[HttpPost] 
public string Post(string text) 

Juste pour voir ce qui s'est passé, j'ai ajouté un attribut [FromBody] à ce paramètre. À ma grande surprise, j'ai eu une erreur 415 au lieu de la 405.

La recherche de l'erreur 415 m'a pris à ce lien:

https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

Le lien me dit qu'un paramètre de chaîne est censé faire partie du uri, et qu'une chaîne dans le corps, envoyé avec l'application/le type de contenu n'a pas de formatter par défaut.

J'ai encapsulé le paramètre de chaîne dans un objet json, comme indiqué dans mon nouveau contrôleur, et maintenant le POST fonctionne. Je suis retourné à mon programme d'origine et j'ai essayé de faire la même chose mais j'ai toujours l'erreur 405; la différence est que maintenant je sais que ce n'est pas un problème IIS.

Je vais ouvrir un autre cas si je ne peux pas faire fonctionner mon programme.