我有一个 .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 等吗?
如果这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
参考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 是更具体的搜索。
我有一个在负载均衡器后面运行的 .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) 我想对一个简单的 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)
我的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
出于以下列出的多种原因,建议使用带有反向代理的 kestrel 进行生产(在microsoft中有记录)
反向代理可以:
可以限制其托管的应用程序暴露的公共表面积。
提供额外的配置和防御层。
IIS 不能在 Linux 上使用,根据基准测试,与 NGINX 或其他程序相比,IIS 被认为是最快的。
由于我的应用程序需要部署在 Linux 上......
1) 为了让我的应用程序获得最佳性能,最好的 Web 服务器是什么,它可以很好地处理多个并发连接并提供防御配置?..
2)Kestrel 单独就能提供最佳性能吗?如果是,那么我如何确保根据 IIS 具有但 kestrel 不喜欢的许多功能来防御应用程序:请求过滤和限制
在 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.不确定这是问题还是操作系统中其他问题的副作用。
环境:
笔记:
尝试过:
schannel: checking server certificate revocationHTTPClient在使用该服务的代码中禁用WinHTTP Web Proxy Auto-Discovery …amazon-web-services kestrel-http-server asp.net-core identityserver4
我读了里克·斯特拉尔写的这篇精彩的文章。据称,微软在 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)
使用 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
我在托管blazor wasm asp.net core hosted应用程序时遇到问题。该解决方案有 3 个项目:Client、Shared和Server。
当我运行命令时,dotnet publish --configuration Release它将库发布到解决方案中各自的文件夹,如下所示:
我假设由于该server项目正在引用client- 那么我托管应用程序的步骤如下:
WebWorkbench3\Server\bin\Release\net5.0\publish在 powershell 中打开dotnet .\WebWorkbench3.Server.dllhttps://localhost:5001/_framework/blazor.webassembly.js未加载的错误。wwwroot服务器应用程序中的文件夹内容,我们将看到以下内容:这解释了为什么显示错误。然而,我此时的问题 - 项目中的发布过程/配置是否应该负责将客户端的内容复制wwwroot到服务器的应用程序输出目录中?如果我们在 VisualStudio 中启动调试会话,那么我们将使用作为server启动点,因此项目应该知道在哪里查找文件blazor.webassembly.js。
那么为什么在发布过程中没有发生相同的过程呢?
注意:我能够通过手动复制客户端的wwwroot目录并将内容放入服务器的wwwroot目录来解决问题...但我不认为这就是服务应该如何工作?
编辑:我刚刚尝试在 IIS 中设置clientblazor 应用程序。它有效。有点儿。页面打开。但是当它尝试向服务器发出 REST …
了解我的应用程序是在 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-core ×8
.net-core ×5
asp.net-mvc ×1
blazor ×1
c# ×1
containers ×1
docker ×1
http.sys ×1
iis-express ×1
linux ×1
timeout ×1
webserver ×1