我有一个非常简单的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);
};
答案 0 :(得分:1)
我在阅读本文时的第一个想法是转移编码仅用于响应而非请求。查看list of HTTP header fields,转移编码仅列在响应字段下。但the spec并未提及发件人和收件人的请求或回复。现在我不太确定。
无论如何,ASP.NET hosting code如果内容长度为0,则明确排除正文,但the self-hosting code似乎没有相同的限制。我不确定这种差异是否是故意的。您可以删除检查内容长度的if语句并将PR发送给Nancy团队。看看他们回来了什么。