Kestrel 修改传入的 http 标头

Jar*_*ron 5 c# kestrel-http-server asp.net-core

我有一个 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 行):

// 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

结果,Kestrel 每次都会抛出 BadHttpRequestException。

关于如何解决这个问题有什么想法吗?

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

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