我有一个正在尝试接收事件的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服务器吗?
添加内容长度的低级钩子?