[编辑] **问题似乎是我们的机器上正在拦截通过端口8888发送的HTML - 改变端口号似乎可以解决问题。在端口8888上运行的可能会执行此操作的内容仍然是一个谜。 **
我的Owin处理程序中有一个最奇怪的错误,它返回一个HTML响应。我把它剥离到了这个:
internal static Task WebUIHandler(IOwinRequest request, IOwinResponse response)
{
response.ContentType = "text/html";
var html = ... build an HTML string ...;
response.Headers["Content-Encoding"] = "gzip";
response.Write(GZip.CompressUTF8(html));
return Task.FromResult(0);
}
GZip.CompressUTF8
调用是将html
字符串压缩为字节数组的实用程序方法(是的,我知道这可以通过流完成,但这不是重点)
当我运行此应用程序时,它所服务的页面似乎是未压缩的(即,以纯文本形式,未经过gzip压缩)并且Content-Encoding
标题不存在(我已经在Fiddler4,Chrome和火狐)。
然而,如果我在return
语句上放置一个断点并让应用程序在继续之前停留几秒钟,那么响应 gzipped并且包含Content-Encoding
标题 。但是只有我让它在断点上设置几秒钟:如果我继续太快,对我来说没有gzip。
任何人都可以解释这里发生了什么吗?我很神秘。
[编辑:根据要求,整个"管道":]
using Microsoft.Owin;
using Microsoft.Owin.Hosting;
using Owin;
...
static void Main(string[] args) {
var startOptions = new StartOptions();
startOptions.Urls.Add(...url...);
using (WebApp.Start(startOptions, AppBuilderAction)) {
...
}
}
...
static void AppBuilderAction(IAppBuilder app) {
var router = new Router();
router.Add("/", WebUIHandler); // See above.
...
app.Run(router.OwinHandler);
}
...
[Router method]
public Task OwinHandler(IOwinContext context) {
var request = context.Request;
var response = context.Response;
... find a handler matching request.Path.Value ...
return handler(request, response);
}
就是这样。除非我误解了Owin计划,否则不会有其他任何阻碍。