Owin SelfHosted WebApp不满足HEAD请求

时间:2015-10-16 22:08:37

标签: c# owin nancy

我使用Microsoft.Owin.Hosting.WebApp自行托管网络应用,但在向服务器发出HEAD请求后,会引发500错误。尝试拉取JSON文件时,错误更改为504。

我见过很多解决方案,但没有适用于WebApp。如果使用NancyFX托管,我可以将AllowChunkedEncoding设置为false以使其正常工作。但那是doesn't seems like a good option

代码段:

var options = new StartOptions("http://localhost:8080")
{
  ServerFactory = "Microsoft.Owin.Host.HttpListener"
};
WebApp.Start<Startup>(options);

启动的实施:

  public class Startup
  {
    public void Configuration(IAppBuilder app)
    {
      app.UseNancy();
    }
  }

调用浏览器或使用Fiddle都会导致失败: enter image description here

我还没有在这里添加Nancy Module实现,因为它不是应该修复问题的地方,因为我也想提供静态内容,但允许HEAD请求。

有没有人知道如何从自托管的OWIN中提供HEAD动词?

2 个答案:

答案 0 :(得分:0)

我刚刚遇到了类似的问题。我了解到HEAD方法响应应该与GET响应相同没有内容。

以下是相关的RFC:https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

示例我有自己托管的Web api应用程序:

EF6

答案 1 :(得分:0)

我对自托管的SignalR应用程序有一个类似的问题,其中HEAD请求导致应用程序崩溃并返回错误代码500。我发现的解决方案是编写一个自定义OWIN中间件层来拦截HEAD请求并返回代码200。 / p>

在您的项目中创建一个名为HeadHandler.cs的新类

using Microsoft.Owin;
using System.Threading.Tasks;

namespace YourProject
{
    public class HeadHandler : OwinMiddleware
    {
        public HeadHandler(OwinMiddleware next) : base(next)
        {
        }

        public override async Task Invoke(IOwinContext context)
        {
            if (context.Request.Method == "HEAD")
            {
                context.Response.StatusCode = 200;
            }
            else
            {
                await Next.Invoke(context);
            }
        }
    }
}

在OWIN Startup类中,在映射任何其他中间件以使用新的HeadHandler中间件之前添加一行。

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.Use<HeadHandler>();
        //The rest of your original startup class goes here
        //app.UseWebApi()
        //app.UseSignalR();
    }
}