【问题标题】:Kestrel server slow on "bad request data"Kestrel 服务器在“错误请求数据”上运行缓慢
【发布时间】:2019-10-01 14:50:33
【问题描述】:

我有一个 IOT 设备(黑匣子,无法对其重新编程),它通过有线以太网向我的 .NET core 2.2 非常简单的服务器控制台应用程序发送 http POST 请求(136 字节的 JSON,一个字符串)。 我只是将字符串输出到控制台。

    [HttpPost]
    public void Post([FromBody] RootObject root)
    {
        string adv = root.prt;
        Console.WriteLine(adv);
    }

我每秒显示不到 1 行,有时是 2。

使用 Fiddler 作为反向代理,我每秒收到 5 到 10 个 http req,这是设备的正确行为。

所以我启用了信息日志,并且每秒都会收到“无效请求行”错误:

info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 POST http://192.168.0.92/api/values application/json 136
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'BluepycWeb.Controllers.ValuesController.Post (BluepycWeb)'
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
      Route matched with {action = "Post", controller = "Values"}. Executing action BluepycWeb.Controllers.ValuesController.Post (BluepycWeb)
02003F002293831000010033FF0006EFAA256B6D1A001E010201061AFF4C000215476C6F62616C2D54616700000000000000000000CD0101CC0001FF001FCC
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
      Executing action method BluepycWeb.Controllers.ValuesController.Post (BluepycWeb) with arguments (BluepycWeb.Controllers.RootObject) - Validation state: Valid
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
      Executed action method BluepycWeb.Controllers.ValuesController.Post (BluepycWeb), returned result Microsoft.AspNetCore.Mvc.EmptyResult in 0.2158ms.
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
      Executed action BluepycWeb.Controllers.ValuesController.Post (BluepycWeb) in 9.4032ms
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'BluepycWeb.Controllers.ValuesController.Post (BluepycWeb)'
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 24.5625ms 200
info: Microsoft.AspNetCore.Server.Kestrel[17]
      Connection id "0HLMO99UNQBGM" bad request data: "Invalid request line: '\x0D\x0A'"
Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Invalid request line: '\x0D\x0A'
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpParser`1.RejectRequestLine(Byte* requestLine, Int32 length)
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpParser`1.GetUnknownMethod(Byte* data, Int32 length, Int32& methodLength)
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpParser`1.ParseRequestLine(TRequestHandler handler, Byte* data, Int32 length)
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpParser`1.ParseRequestLine(TRequestHandler handler, ReadOnlySequence`1& buffer, SequencePosition& consumed, SequencePosition& examined)
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpParser`1.Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.IHttpParser<TRequestHandler>.ParseRequestLine(TRequestHandler handler, ReadOnlySequence`1& buffer, SequencePosition& consumed, SequencePosition& examined)
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1Connection.TakeStartLine(ReadOnlySequence`1 buffer, SequencePosition& consumed, SequencePosition& examined)
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1Connection.ParseRequest(ReadOnlySequence`1 buffer, SequencePosition& consumed, SequencePosition& examined)
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1Connection.TryParseRequest(ReadResult result, Boolean& endConnection)
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequestsAsync[TContext](IHttpApplication`1 application)

如果我通过 Postman 连续发送相同的 JSON Paylod,则没有错误,没有延迟。 这个错误,我不知道如何避免,也不知道是由什么引起的(但它似乎并没有干扰 Fiddler)似乎让我的服务器挂了一秒钟。

关于如何解决这个问题的任何建议? 丢弃/纠正错误? 保留错误但不减慢数据接收速度?

更新: 使用 IISExpress 托管,没问题,没有“Invalid request line: '\x0D\x0A'”错误,非常快。 问题仅在于使用 Kestrel。

谢谢!

【问题讨论】:

  • 某种空白问题。 \x0D\x0A == \r\n
  • 当然可以,但是在哪里以及如何处理呢?无法调试 IOT 设备代码来检查它发送的内容。使用 Fiddler 截取数据似乎没有问题。此外,使用 IISExpress 托管也没有问题。只用红隼
  • 对此不太了解,该设备似乎有点垃圾邮件;也许您可以编写一个请求过滤器或中间件来处理这个问题。默默地忽略错误比异常更可取。
  • 你能告诉我一个忽略这种错误的方法吗?我应该在哪里过滤请求?另外我不明白为什么我在使用 Kestrel 而不是 IIISExpress 时遇到此问题

标签: asp.net-web-api .net-core kestrel


【解决方案1】:

昨天我的 ASP .NETCore 服务遇到了同样的问题。 然后意识到我正在向我的 Kestrel 服务器发送 HTTPS 请求,而它未配置为侦听 HTTPS 协议,这就是 Kestrel 抱怨的原因。

如果你想在你的 kestrel 中使用 HTTPS,你有多个选项来配置它,例如:

使用分配的服务器证书:

var host = new WebHostBuilder() .UseKestrel(options => options.Listen(IPAddress.Any, 443, listenOptions => listenOptions.UseHttps("MyCert.pfx")))

具有多个主机名和证书:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
    .UseStartup<Startup>()
    .ConfigureKestrel((context, options) =>
    {
        options.ListenAnyIP(5005, listenOptions =>
        {
            listenOptions.UseHttps(httpsOptions =>
            {
                var localhostCert = CertificateLoader.LoadFromStoreCert(
                    "localhost", "My", StoreLocation.CurrentUser, 
                    allowInvalid: true);
                var exampleCert = CertificateLoader.LoadFromStoreCert(
                    "example.com", "My", StoreLocation.CurrentUser, 
                    allowInvalid: true);
                var subExampleCert = CertificateLoader.LoadFromStoreCert(
                    "sub.example.com", "My", StoreLocation.CurrentUser, 
                    allowInvalid: true);
                var certs = new Dictionary<string, X509Certificate2>(
                    StringComparer.OrdinalIgnoreCase);
                certs["localhost"] = localhostCert;
                certs["example.com"] = exampleCert;
                certs["sub.example.com"] = subExampleCert;

                httpsOptions.ServerCertificateSelector = (connectionContext, name) =>
                {
                    if (name != null && certs.TryGetValue(name, out var cert))
                    {
                        return cert;
                    }

                    return exampleCert;
                };
            });
        });
    });

【讨论】:

    猜你喜欢
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 2019-01-05
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多