Kestrel修改传入的HTTP标头

时间:2018-07-06 16:26:21

标签: c# asp.net-core kestrel-http-server

我有一个正在尝试接收事件的IP摄像机。例如,如果它在帧的特定部分检测到运动,我想知道它并获取随事件捕获的图像。

问题在于它使用HTTP / 1.0 POST发送此信息。根据规范(https://www.w3.org/Protocols/HTTP/1.0/draft-ietf-http-spec.html#BodyLength),可以通过Content-Length标头或通过在将所有内容发送到服务器后关闭连接来传达主体长度。 IP摄像机执行这两种方法中的后一种。

Kestrel的Web服务器不支持此功能,如此处所示,Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1MessageBody.For()包含以下内容(https://github.com/aspnet/KestrelHttpServer/blob/2191327b59f87f23f69fff2ac0dba9e58b67141b/src/Kestrel.Core/Internal/Http/Http1MessageBody.cs,第308-318行):< / p>

// Avoid slowing down most common case
if (!object.ReferenceEquals(context.Method, HttpMethods.Get))
{
    // If we got here, request contains no Content-Length or Transfer-Encoding header.
    // Reject with 411 Length Required.
    if (context.Method == HttpMethod.Post || context.Method == HttpMethod.Put)
    {
        var requestRejectionReason = httpVersion == HttpVersion.Http11 ? RequestRejectionReason.LengthRequired : RequestRejectionReason.LengthRequiredHttp10;
        BadHttpRequestException.Throw(requestRejectionReason, context.Method);
    }
}

结果,Kestrel每次都抛出BadHttpRequestException。

关于如何解决此问题的任何想法?

  • 可以在Kestrel旁边运行的TCP服务器吗?

  • 添加内容长度的低级钩子?

0 个答案:

没有答案