当Transfer-Encoding被分块时空请求体 - NancyFX

时间:2015-09-10 19:41:24

标签: c# iis nancy transfer-encoding

我有一个非常简单的NancyFX模块,我只想将API调用的结果回显给发送者。

我正在使用一个Facade,它将传入的XML转换为JSON,然后再将其传递给Nancy端点。这个外观正确地将内容更改为JSON,因为我可以使用api的echo服务测试它,并且可以看到响应。

但是,因为facade会删除content-length标头并将transfer-encoding设置为chunked,所以我的Nancy模块中的Request.Body始终为空。

是否需要在NancyFX中启用对Chunked编码的支持?

我目前在IIS 7上托管,但也可以访问IIS 8。

我可以看到使用OWIN托管它可以使用HostConfiguration启用分块传输,但由于其他因素,我无法使用OWIN托管并依赖IIS托管。

我已使用以下命令在IIS上启用了分块传输:

appcmd set config /section:asp /enableChunkedEncoding:True

我的web.config目前是:

<?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>

模块本身非常简单,包括:

    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);
    };

1 个答案:

答案 0 :(得分:1)

我在阅读本文时的第一个想法是转移编码仅用于响应而非请求。查看list of HTTP header fields,转移编码仅列在响应字段下。但the spec并未提及发件人和收件人的请求或回复。现在我不太确定。

无论如何,ASP.NET hosting code如果内容长度为0,则明确排除正文,但the self-hosting code似乎没有相同的限制。我不确定这种差异是否是故意的。您可以删除检查内容长度的if语句并将PR发送给Nancy团队。看看他们回来了什么。