标签: kestrel-http-server

IIS Express/Kestrel 因 OPTIONS 请求而挂起

我有一个 .NET Core 2.0 项目,针对完整的 .NET Framework:

<TargetFramework>net461</TargetFramework>
...
<PackageReference Include="Microsoft.AspNetCore" Version="2.0.0" />
Run Code Online (Sandbox Code Playgroud)

在 Windows 10 的本地主机上运行,​​使用 Visual Studio Community 2017 (15.7.4) 和 IIS Express (10.0.14358.1000)。

很多时候,ajax 请求会卡在该OPTIONS请求上(参见图片),从而阻止所有后续请求(它们也会卡在 上OPTIONS (pending))。

这可能发生在第一个请求时,或者发生在调试会话期间,直到那时为止都很好。

唯一的解决方案是停止在 VS 中调试项目,停止 IIS Express 并再次构建项目,然后再次启动调试器。

我不知道如何调试这个问题,或者如何找出导致它的原因。是 VS、Kestrel、IIS Express 等吗?

这是它在 Chrome 中的样子: 在此输入图像描述

如果这Program.cs有帮助的话,看起来是这样的:

public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
}
Run Code Online (Sandbox Code Playgroud)

编辑

这些是典型 OPTIONS 请求的请求/响应标头(这个效果很好)

请求标头

OPTIONS /api/items/2450 …
Run Code Online (Sandbox Code Playgroud)

iis-express kestrel-http-server asp.net-core visual-studio-2017 iis-express-10

5
推荐指数
0
解决办法
641
查看次数

Kestrel ssl JSON 配置中的证书问题

参考Kestrel 文档,是否可以使用 appsettings.json 文件配置 https:

  "HttpsInlineCertStore": {
    "Url": "https://+:5002",
    "Certificate": {
      "Subject": "<coma separated multi-line subject name>",
      "Store": "Root",
      "Location": "LocalMachine"
  }
Run Code Online (Sandbox Code Playgroud)

该证书肯定存在,下一个代码返回会找到它:

        using (var certStore = new X509Store(StoreName.Root, StoreLocation.LocalMachine))
        {
            certStore.Open(OpenFlags.ReadOnly);
            var certificates = certStore.Certificates.Find(
                X509FindType.FindBySubjectDistinguishedName, "<coma separated multi-line subject name>", true);

            return certificates .Count > 0 ? certificates [0] : null;;
        }
Run Code Online (Sandbox Code Playgroud)

同时,如果通过 X509FindType.FindBySubjectName 搜索证书,它什么也找不到,我相信这就是问题所在,即使微软说 FindBySubjectDistinguishedName 是更具体的搜索。

ssl-certificate .net-core kestrel-http-server

5
推荐指数
1
解决办法
3903
查看次数

如何在.NET Core Kestrel Web API中设置请求超时?

我有一个在负载均衡器后面运行的 .NET Core 2.2 Web API 项目。负载均衡器的超时设置为 60 秒。我想将应用程序中的超时设置为 55 秒,以便我可以清理内容并向调用者返回自定义消息。

我发现如果应用程序在 IIS 下运行,则可以在 web.config 中设置超时,但我的应用程序在基于 Linux 的 docker 容器中的 Kestrel 下运行。

我尝试了以下方法,但没有成功。

var builder = WebHost.CreateDefaultBuilder(args)
                .ConfigureKestrel((context, options) =>
                {
                    options.Limits.KeepAliveTimeout = TimeSpan.FromSeconds(10);
                });
Run Code Online (Sandbox Code Playgroud)

timeout .net-core kestrel-http-server

5
推荐指数
0
解决办法
2758
查看次数

ASP.net Core Web 应用程序在 Docker 容器中运行时未接收请求

我想对一个简单的 ASP.net Core Web 应用程序进行dockerize,该应用程序使用 Kestrel 托管 REST API。

正如您在控制台输出中看到的,当我在本地计算机上运行该应用程序时,该应用程序运行得非常好。我看到它正在侦听的 URL 以及我调用的端点以确保它正确运行:

> dotnet DockerTest.dll
> Hosting environment: Production
> Now listening on: https://localhost:5001
> Now listening on: http://localhost:5000
> Application started. Press Ctrl+C to shut down.
> info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET http://localhost:5000/api/values
...
Run Code Online (Sandbox Code Playgroud)

现在到 docker 部分:

我的Dockerfile非常简单。我提取 ASP.net Core 基础映像,复制输出dotnet publish "DockerTest.csproj" -c Release -o ./output并执行它,就像在本地计算机上执行它一样:

Dockerfile:

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2
WORKDIR /app
COPY ./output .
ENTRYPOINT ["dotnet", "DockerTest.dll"]
Run Code Online (Sandbox Code Playgroud)

使用 构建映像后 …

containers environment-variables docker kestrel-http-server asp.net-core

5
推荐指数
1
解决办法
4578
查看次数

.NET Core 和 Kestrel - 在 Linux 上部署的 ASP.NET CORE Web api 应用程序的反向代理 Web 服务器应该是什么?

出于以下列出的多种原因,建议使用带有反向代理的 kestrel 进行生产(在microsoft中有记录)

反向代理可以:

  1. 可以限制其托管的应用程序暴露的公共表面积。

  2. 提供额外的配置和防御层。

  3. 可能与现有基础设施更好地集成。
  4. 简化负载平衡和安全通信 (HTTPS) 配置。只有反向代理服务器需要 X.509 证书,并且该服务器可以使用纯 HTTP 与内部网络上的应用程序服务器进行通信。

IIS 不能在 Linux 上使用,根据基准测试,与 NGINX 或其他程序相比,IIS 被认为是最快的。

由于我的应用程序需要部署在 Linux 上......

1) 为了让我的应用程序获得最佳性能,最好的 Web 服务器是什么,它可以很好地处理多个并发连接并提供防御配置?..

2)Kestrel 单独就能提供最佳性能吗?如果是,那么我如何确保根据 IIS 具有但 kestrel 不喜欢的许多功能来防御应用程序:请求过滤和限制

linux webserver .net-core kestrel-http-server asp.net-core

5
推荐指数
1
解决办法
3925
查看次数

在运行基于 IdentityServer 4 的产品的实例上,HTTPS 出站请求时间在 14-21 天后增加到 5 分钟

在 AWS 集群上运行基于 IdentityServer 4 的 ASP.Net Core 应用程序,14-21 天后,所有传出 HTTPS 请求需要 5 分钟或更长时间才能完成。

经过调查发现,死机WinHTTP Web Proxy Auto-Discovery Service出现以下错误:The endpoint mapper database entry could not be created.不确定这是问题还是操作系统中其他问题的副作用。

环境:

  • ELB 具有自动缩放组,其后面有两个实例,两个实例均出现问题
  • Windows 服务器 2019

笔记:

  • 它是一个自定义 AMI,但与没有遇到此情况的实例的唯一区别是产品在其上运行。
  • 发生在基于 .Net core 2.2 和 3.1 的应用程序版本上
  • 基于 IdentityServer4 v2 和 v3 的两个版本都会发生
  • 该应用程序是独立部署的
  • 该应用程序使用 Kestrel,前面没有反向代理

尝试过:

  • 启用 schannel:跟踪上设置的 schannel 日志中没有错误
  • 任何 EventViewer 日志中都没有其他值得注意的错误
  • 重启实例即可解决问题
  • 当运行curl.exe -v到机器上的HTTPS站点时,请求被卡住schannel: checking server certificate revocation
  • 实例上的时钟正常
  • 重新启动应用程序进程无法解决问题
  • HTTPClient在使用该服务的代码中禁用WinHTTP Web Proxy Auto-Discovery …

amazon-web-services kestrel-http-server asp.net-core identityserver4

5
推荐指数
1
解决办法
1762
查看次数

尽管 InProcess 模式的速度更快,为什么 DotNet Core 中的 Kestrel 却诞生了?

我读了里克·斯特拉尔写的这篇精彩的文章。据称,微软在 DotNet core 2.2 后决定添加InProcess模式,直接使用 IIS 来处理请求,而不是使用OutOfProcessKestrel Web 服务器处理进程。我们知道,在这种模式下,IIS 被用作反向 Web 服务器代理来获取请求并将其发送给 Kestrel。

  <!-- hostingModel is the new property here -->
  <aspNetCore processPath="dotnet" arguments=".\WebApplication1.dll"    
              stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout"
              hostingModel="InProcess" />
Run Code Online (Sandbox Code Playgroud)

然后Rick Strahl在他的文章中比较了InProcess模式和OutOfProcess模式,得到的结果是直接使用IIS而不使用Kestrel(InProcess模式)进程要快得多。(甚至他证明 IIS 使用原始 Kestrel 速度更快)

有了这个结果,我想知道为什么我们还有 Kestrel?只是为了在其他反向 Web 服务器(例如 Apache Nginx 和...)之前使用我们的 DotNet 核心应用程序?或者还有其他一些使用 OutOfProcess 有用的场景?我简单地说为什么我们应该同时使用两者(IIS + Kestrel)

.net-core kestrel-http-server asp.net-core

5
推荐指数
1
解决办法
959
查看次数

ASP.NET core 3.1:ConfigureAppConfiguration 是否与 launchSettings.json 交互?

使用 kestrel 从 Visual Studio 2019 启动 ASP.NET core 3.1 Web 应用程序时,我遇到了奇怪的行为(我的意思是不使用IIS Express 的启动配置文件)。

我创建了一个最小的应用程序来重现该问题。

操作系统:Windows 10(内部版本 19041.746) Visual Studio 版本:Visual Studio 2019 版本 16.8.4

这是 csproj 文件:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>


</Project>
Run Code Online (Sandbox Code Playgroud)

这是 launchSettings.json 文件:

{
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:52222",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "weatherforecast",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "TestWebApplication": {
      "commandName": "Project",
      "launchBrowser": …
Run Code Online (Sandbox Code Playgroud)

c# .net-core kestrel-http-server asp.net-core asp.net-core-3.1

5
推荐指数
1
解决办法
2576
查看次数

在 kestrel 中托管 blazor wasm asp.net core 托管应用程序

我在托管blazor wasm asp.net core hosted应用程序时遇到问题。该解决方案有 3 个项目:ClientSharedServer

当我运行命令时,dotnet publish --configuration Release它将库发布到解决方案中各自的文件夹,如下所示:

  • WebWorkbench3\客户端\bin\Release\net5.0\publish
  • WebWorkbench3\服务器\bin\Release\net5.0\publish
  • ...

我假设由于该server项目正在引用client- 那么我托管应用程序的步骤如下:

  1. WebWorkbench3\Server\bin\Release\net5.0\publish在 powershell 中打开
  2. 运行命令dotnet .\WebWorkbench3.Server.dll

在此输入图像描述

  1. 导航:https://localhost:5001/
  2. 结果:
  • 预期:客户端页面打开
  • 实际:页面卡在“正在加载..”字符串处。在控制台中我们看到有一个关于_framework/blazor.webassembly.js未加载的错误。

在此输入图像描述

  1. 如果我们要检查wwwroot服务器应用程序中的文件夹内容,我们将看到以下内容:

在此输入图像描述

这解释了为什么显示错误。然而,我此时的问题 - 项目中的发布过程/配置是否应该负责将客户端的内容复制wwwroot到服务器的应用程序输出目录中?如果我们在 VisualStudio 中启动调试会话,那么我们将使用作为server启动点,因此项目应该知道在哪里查找文件blazor.webassembly.js

在此输入图像描述

那么为什么在发布过程中没有发生相同的过程呢?

注意:我能够通过手动复制客户端的wwwroot目录并将内容放入服务器的wwwroot目录来解决问题...但我不认为这就是服务应该如何工作?

编辑:我刚刚尝试在 IIS 中设置clientblazor 应用程序。它有效。有点儿。页面打开。但是当它尝试向服务器发出 REST …

kestrel-http-server asp.net-core blazor blazor-webassembly

5
推荐指数
1
解决办法
2710
查看次数

我如何知道我的应用程序是在 Kestrel 还是 HTTP.sys 下运行?

了解我的应用程序是在 Kestrel 还是 HTTP.sys 下运行的最佳方法是什么。到目前为止,我所发现的只是检查 HttpConext 属性类名称之一中是否有“Kestrel”。

在 MVC 控制器中我可以执行以下操作:

Boolean IsKestrel = HttpContext.Features.GetType().ToString().Contains("Kestrel");
Run Code Online (Sandbox Code Playgroud)

即检查这个:

Features = {Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1Connection<Microsoft.AspNetCore.Hosting.HostingApplication.Context>}
Run Code Online (Sandbox Code Playgroud)

使用 HTTP.sys 时我只得到:

Features = {Microsoft.AspNetCore.Http.Features.FeatureCollection}
Run Code Online (Sandbox Code Playgroud)

(这里的“Http”足以知道这是HTTP.sys吗?)

一定会有更好的办法。是否有一个明显的属性包含正在使用的主机的名称?

更广泛的问题可能是,我如何知道构建器模式构建了什么?

更新

找到了更好的东西,但仍在寻找具有服务器名称或类型的属性。

在 MVC 控制器中:

var isKestrel = HttpContext.Request.Headers.GetType().ToString().Contains(".Kestrel.");
var isHTTPsys = HttpContext.Request.Headers.GetType().ToString().Contains(".HttpSys.");
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc http.sys kestrel-http-server asp.net-core

5
推荐指数
2
解决办法
2527
查看次数