2015-09-10 2 views
1

J'ai un module NancyFX très simple dont je veux simplement faire écho les résultats d'un appel API à l'expéditeur. J'utilise une façade qui convertit le XML entrant en JSON avant de le remettre au point de terminaison Nancy. Cette façade modifie correctement le contenu en JSON car je peux le tester en utilisant le service d'écho pour l'API et voir la réponse.Corps de requête vide lorsque le codage de transfert est fragmenté - NancyFX

Cependant, comme la façade supprime l'en-tête content-length et définit l'encodage de transfert sur chunked, le Request.Body est toujours vide dans mon module Nancy.

Existe-t-il une configuration nécessaire pour activer la prise en charge du codage Chunked dans NancyFX?

J'héberge actuellement sur IIS 7, mais j'ai également accès à IIS 8.

Je peux voir qu'en utilisant l'hébergement OWIN, il est possible d'activer le transfert en bloc en utilisant HostConfiguration, mais pour d'autres raisons je ne peux pas utiliser l'hébergement OWIN et compter sur l'hébergement IIS.

J'ai activé chunked transfert sur IIS avec la commande:

appcmd set config /section:asp /enableChunkedEncoding:True 

Mon web.config est actuellement:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.web> 
    <compilation debug="true" targetFramework="4.5.1" /> 
    <httpHandlers> 
     <add verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" path="*" /> 
    </httpHandlers> 
    <httpRuntime targetFramework="4.5.1" /> 
    <webServices> 
     <protocols> 
     <add name="HttpGet" /> 
     <add name="HttpPost" /> 
     </protocols> 
    </webServices> 
    </system.web> 
    <system.webServer> 
    <modules> 
     <remove name="WebDavModule" /> 
    </modules> 
    <handlers> 
     <remove name="WebDAV" /> 
     <add name="Nancy" verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" path="*" /> 
    </handlers> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <httpErrors existingResponse="PassThrough" /> 
    </system.webServer> 
</configuration> 

Le module lui-même est très simple et se compose de:

Post["/"] = parameters => 
    { 
     var traceRef = Guid.NewGuid(); 
     var body = this.Request.Body.AsString(); 
     Logger.Trace("Trace ref: {0}, request inbound.", traceRef); 
     Logger.Trace(body); 

     AuthRequest auth = new AuthRequest(); 
     try 
     { 
      auth = this.Bind<AuthRequest>(); 
     } 
     catch (Exception ex) 
     { 
      Logger.Error("Trace ref: {0}, error: {1}. Exception: {2}", traceRef, ex.Message, ex); 
     } 

     var responseObject = new 
     { 
      this.Request.Headers, 
      this.Request.Query, 
      this.Request.Form, 
      this.Request.Method, 
      this.Request.Url, 
      this.Request.Path, 
      auth 
     }; 

     return Response.AsJson(responseObject); 
    }; 

Répondre

1

Ma première pensée en lisant ceci était Transfert-Encodage est seulement destiné aux réponses non demandes. En regardant le list of HTTP header fields, Transfer-Encoding est seulement listé sous Champs de réponse. Mais the spec ne mentionne pas la demande ou la réponse juste l'expéditeur et le destinataire. Maintenant, je ne suis pas si sûr.

De toute façon, le ASP.NET hosting code exclut explicitement le corps si la longueur du contenu est 0, mais the self-hosting code ne semble pas avoir la même restriction. Je ne suis pas sûr si cette différence est intentionnelle. Vous pouvez supprimer l'instruction if qui vérifie la longueur du contenu et envoyer un PR à l'équipe de Nancy. Voyez ce qu'ils reviennent.

+0

Merci @ Joe-B. Je vais jeter un coup d'oeil à la source de Nancy. J'ai fini par contourner ce problème en supprimant la responsabilité de la conversion de JSON en XML et en laissant à la place le modèle Nancy prendre en charge la réception et la liaison de XML ou de JSON. –