我的情况如下:我有一个ASP.NET Core REST API,它使用Kestrel通过IIS反向代理(通过AspNetCoreModule)。在一个特殊的端点(由硬件设备要求)上,我发送一个“ 连接:关闭 ” -HTTP标头。在所有其他端点上,我不发送此标头。因此,当我以独立模式(没有IIS)启动REST API时,一切都按预期工作。但是,只要我在IIS上运行它,IIS便不会转发Connection标头,尽管所有其他标头都可以正确转发。禁用所有端点的保持活动不是一种选择。到目前为止,我一直在尝试为IIS安装重写模块,并创建一个出站规则,使其与Connection标头设置匹配,以关闭并在匹配时将其重置。看来IIS会忽略RESPONSE_Connection和HTTP_CONNECTION服务器变量(我用相同的规则尝试了其他标头,并且它起作用了)。
最好的解决方案是甚至不安装重写模块。在此先感谢您提供任何解决方案。
iis reverse-proxy keep-alive kestrel-http-server asp.net-core
我正在使用ASP.Net Core,我有2个项目.
如果我使用Postman尝试其中一个WebApi端点,我没有任何问题,并且/ api/values按预期返回(标准测试端点)
但是,如果我使用MVC应用程序尝试相同的操作,我会得到一个非常令人沮丧的错误:
HttpsConnectionFilter[1]
Failed to authenticate HTTPS connection
Run Code Online (Sandbox Code Playgroud)
我正在使用Kestrel托管Asp.Net核心.
我有一个使用PowerShell创建的自签名PFX证书,这是抛出异常的代码:
var handler = new HttpClientHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.SslProtocols = SslProtocols.Tls12;
handler.ClientCertificates.Add(new X509Certificate2("localcert.pfx", "xxx"));
var client = new HttpClient(handler);
var content = await client.GetStringAsync("https://localhost:44301/api/values");
Run Code Online (Sandbox Code Playgroud)
如果我要运行这个,我会得到同样的错误:
var client = new HttpClient();
var content = await client.GetStringAsync("https://localhost:44301/api/values");
Run Code Online (Sandbox Code Playgroud)
我的Kestrel设置在我的Program.cs中是这样的
var cert = new X509Certificate2("localcert.pfx", "xxx");
var host = new WebHostBuilder()
.UseKestrel(cfg => cfg.UseHttps(cert))
.UseUrls("https://localhost:44300")
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run();
Run Code Online (Sandbox Code Playgroud)
我知道我为上面的HttpClient再次定义了证书,但我很绝望.
任何人都可以提供一些见解,了解为什么会发生这种情况,以及如何修复它,甚至调试它,因为它让我发疯.我正在浏览并单步执行KestrelHttpServer代码,看看是否会提供一些见解.
这是我从Kestrel控制台窗口获得的完整错误
info:HttpsConnectionFilter 1 无法验证HTTPS连接.System.IO.IOException:身份验证失败,因为远程方已关闭传输流.在System.Net.Security.SslState.StartReadFrame(Byte []缓冲区,Int32 …
我正在Linux上运行ASP.NET Core API,在Google Cloud中的Kubernetes上运行.
这是一个具有高负载的API,并且在每次请求时它都在执行一个执行长(1-5秒)CPU密集型操作的库.
我看到的是,在部署之后,API可以正常工作一段时间,但是在10-20分钟后它变得无法响应,甚至健康检查端点(只返回硬编码200 OK)也会停止工作并超时.(这使得Kubernetes杀死了豆荚.)
有时我也会Heartbeat took longer than "00:00:01"在日志中看到臭名昭着的错误消息.
谷歌搜索这些现象指向我"线程饥饿",因此有太多的线程池线程启动,或太多的线程阻塞等待某事,所以池中没有任何线程可以拿起ASP.NET核心请求(因此甚至健康检查端点的超时).
解决此问题的最佳方法是什么?我开始监视由ThreadPool.GetMaxThreads和返回的数字ThreadPool.GetAvailableThreads,但它们保持不变(完成端口总是1000最大和可用,并且工作者总是32767).
我应该监控其他任何财产吗?
由于我们已将.NET Core 2.0更新为.NET Core 2.1(SDK 2.1.302),因此我们的Linux Docker ASP.NET Core容器服务器日志将由以下“信息”日志条目填充:
INFO|Microsoft.AspNetCore.Server.Kestrel|Connection id "0HLFG42JUAORG" bad request
data: "Invalid request line:
'CNXN\x00\x00\x00\x01\x00\x00\x04\x00\x1B\x00\x00\x00M\x0A'"
Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Invalid
request line: 'CNXN\x00\x00\x00\x01\x00\x00\x04\x00\x1B\x00\x00\x00M\x0A'
INFO|Microsoft.AspNetCore.Server.Kestrel|Connection id "0HLFG42JUAORH" bad request
data: "Invalid request line:
'CNXN\x00\x00\x00\x01\x00\x00\x04\x00\x1B\x00\x00\x00M\x0A'"
Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Invalid
request line: 'CNXN\x00\x00\x00\x01\x00\x00\x04\x00\x1B\x00\x00\x00M\x0A'
Run Code Online (Sandbox Code Playgroud)
连接ID每秒钟大约增加1个alpha /数字。十六进制似乎没有转换为任何有意义的(NUL NUL NUL SOH NUL NUL EOT NUL ESC NUL NUL LF)。
我们排除的事情:
我试图在Linux上安装ASP.NET 5时理解整个Web /框架/应用程序堆栈.
我读过的所有说明,包括这一条都没有真正回答我的问题:
为什么Nginx服务器不能在没有 Kestrel的情况下工作:http://www.mono-project.com/docs/web/fastcgi/nginx/?
或者我离开了.我试图了解这个结构的原因是什么:
.NET Core(or mono) --> Kestrel --> Nginx
Run Code Online (Sandbox Code Playgroud)
Kestrel不是像Nginx这样的另一个Web服务器,但功能却少得多吗?
我很难找到如何使用launch.json文件在Windows上的Visual Studio Code中设置调试的指令(如果重要,则为10).
有人可以定义如何设置它吗?
是否可以在ASP.NET Core/Kestrel中使用摘要式身份验证?如果是,我该如何启用和使用它?
我知道基本身份验证不会也不会实现,因为它被认为是不安全和缓慢的,但我找不到任何关于摘要的内容.
我不想使用IIS的身份验证,因为我不想绑定到Windows帐户,我想使用自定义凭据验证逻辑.
在过去的8个月左右,我的开发机器上运行了两个站点.两个站点都使用ASP.NET Core,两者都在IIS后面的Kestrel上运行.
在过去的几周里,这些网站变得令人头疼.在构建或重新启动IIS之后,这些站点工作正常,但几分钟后,它们没有响应.没什么,我的意思是当我在浏览器或任何其他应用程序中访问它们时绝对没有任何反应.VS中没有显示输出(如果附加调试器,则无论如何都会失败).如果我在web.config中启用stdout,我可以看到它需要几秒钟,只是为了记录来自Entity Framework的语句的查询.如果禁用stdout,问题仍然存在.
我的机器是i7-6700K,配有16 gb内存.当发生这种情况时,我的CPU使用率大约在0-3%左右,而我最后一次检查时我的内存占用了50%.
两个站点都使用MySQL服务器5.7,同时也被其他应用程序使用.当发生这种情况时,常规ASP.NET网站可以正常工作.
两个项目中使用的NuGet包:
此外,项目A正在引用:
项目B正在引用:
软件版本:
这两个站点在我们的生产Web服务器中运行良好,问题只发生在我的开发机器上,并且具有完全相同的构建!
更新2018-05-08
我已经尝试设置nLog dbProvider并删除了Mark G.建议的MySql.Data NuGet包,但问题仍然存在.
已经格式化并安装了整台PC.没变.
更新2018-05-09
调试似乎保持网站活着..但这不是一个可行的解决方案.
更新2018-05-09
现在它也发生在生产中.
更新2018-05-09
我已经尝试了早期版本的网站,其中NLog尚未实现,因此没有MySql.Data,而且Microsoft.AspNetCore.All不会被强制为2.0.7,只有2.0.0,我也有同样的结果.
我还尝试将所有NuGet软件包更新到最新版本,但没有运气.
更新2018-05-11
我可能会接近找到解决方案.我已经从我的Startup.Configure()中删除了以下两行代码.它看起来很有希望,但我没有太多的时间来测试,但据我所知,它已经解决了现在的问题!:)
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
Run Code Online (Sandbox Code Playgroud) 有没有办法访问文件中 .NET Core 应用程序的数据库上下文program.cs?我基本上希望使用存储在数据库中的特定选项来配置 Kestrel,因此我需要访问数据库上下文。
我基本上想做这样的事情:
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseSentry()
.UseKestrel(opts =>
{
opts.Listen(IPAddress.Any, 443, listenOptions =>
{
var storedCert = _db.Certificates.First(c => c.Id == 1);
var certBytes = Convert.FromBase64String(storedCert.CertificatePfx);
var certPassword = storedCert.CertificatePassword;
var cert = new X509Certificate2(certBytes, certPassword);
listenOptions.UseHttps(cert);
});
});
Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的 .NET Core v3.1 Blazor 应用程序中上传多个文件,但无法超过 30MB 的限制。
搜索这个我发现在 Asp.Net 核心中增加上传文件大小并尝试了建议,但它不起作用。
所有找到的解决方案都涉及更改 web.config,但我没有那个文件。
此外,我的应用程序在开发期间在 Visual Studio 2019 中运行,但也将作为 WebApp 在 Azure 上运行。
这些是我的设置:
program.cs
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>().ConfigureKestrel((context, options) =>
{
options.Limits.MaxRequestBodySize = null;
});
});
Run Code Online (Sandbox Code Playgroud)
上传控制器.cs
[Authorize]
[DisableRequestSizeLimit]
public class UploadController : BaseApiController
Run Code Online (Sandbox Code Playgroud)
Startup.cs 中的配置服务
services.AddSignalR(e => e.MaximumReceiveMessageSize = 102400000)
.AddAzureSignalR(Configuration["Azure:SignalR:ConnectionString"]);
services.Configure<FormOptions>(options =>
{
options.ValueLengthLimit = int.MaxValue;
options.MultipartBodyLengthLimit = long.MaxValue; // <-- !!! long.MaxValue
options.MultipartBoundaryLengthLimit = int.MaxValue;
options.MultipartHeadersCountLimit = int.MaxValue; …Run Code Online (Sandbox Code Playgroud) c# file-upload iis-express kestrel-http-server asp.net-core-3.1
asp.net-core ×8
c# ×4
.net-core ×2
iis ×2
file-upload ×1
https ×1
iis-express ×1
keep-alive ×1
kubernetes ×1
nginx ×1
windows ×1