繁体   English   中英

Owin SelfHosted WebApp无法满足HEAD请求

[英]Owin SelfHosted WebApp does not fulfill HEAD requests

我使用Microsoft.Owin.Hosting.WebApp自托管一个Web应用程序,但是向服务器发出HEAD请求后,它将引发500错误。 尝试提取JSON文件时,错误更改为504。

我见过许多解决方案,但没有一个适用于WebApp 如果使用NancyFX托管,则可以将AllowChunkedEncoding设置为false以使其工作。 但这似乎不是一个好选择

程式码片段:

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都会导致失败: 在此处输入图片说明

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

有谁知道如何通过自托管OWIN为HEAD动词提供服务?

我只是遇到了一个非常类似的问题。 我了解到HEAD方法的响应应该与GET响应相同, 没有内容。

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

我的自托管Web api应用程序具有以下示例:

[HttpHead]
[HttpGet]
[ResponseType(typeof(string))]
public HttpResponseMessage LiveCheck(HttpRequestMessage request)
{
    HttpResponseMessage response;

    response =  request.CreateResponse(HttpStatusCode.OK);
    if (request.Method == HttpMethod.Get)
    {
        response.Content = new StringContent("OK", System.Text.Encoding.UTF8, "text/plain");
    }
    return response;
}

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

在您的项目中创建一个名为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();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM