如何在 .net framework 4.5.x 或 4.6.x 下运行的应用程序中托管 kestrel Web 服务器。目前我收到一个错误说
“无法加载 DLL 'libuv':找不到指定的模块。(来自 HRESULT 的异常:0x8007007E)
在 .net 4.xx 上运行 kestrel 具有作为嵌入式 Web 服务器的好处,可用于从 Windows 服务等提供网页。
我在我的应用程序中提供了一堆静态文件app.UseStaticFiles()。我想在发送之前为特定 HTML 文件的响应注入一些额外的标记。我的第一次尝试是在静态文件中间件之前添加这样的中间件:
app.Use(async (context, next) => {
await next();
// Modify the response here
});
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用,因为我实际上无法读取读取响应流 - 它在幕后使用 Kestrel FrameResponseStream,这是不可读的。
所以,我想我可以用MemoryStream我可以写入的响应正文流替换:
app.Use(async (context, next) => {
context.Response.Body = new MemoryStream();
await next();
// Modify the response here
});
Run Code Online (Sandbox Code Playgroud)
但这只会导致请求永远不会完成 - 它经历了所有管道阶段,但它甚至从未向浏览器返回任何标头。
那么,有什么方法可以修改由 产生的响应StaticFileMiddleware吗?
更新
由于所讨论的 HTML 文件很小(765 字节),因此不必担心内存消耗。但是,任何读取/修改响应的尝试仍会导致与以前相同的问题(不返回任何内容)。更明确地说,这是正在做的事情:
app.Use(async (context, next) => {
var originalStream = context.Response.Body;
var bufferStream = new MemoryStream();
context.Response.Body = bufferStream;
await next();
bufferStream.Seek(0, SeekOrigin.Begin);
if (/* some …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试按照本教程在 Azure 上的 Ubuntu16.04 虚拟机上部署 DotNetCore 应用程序:https ://docs.microsoft.com/en-us/aspnet/core/publishing/linuxproduction
将生成的文件夹的内容部署dotnet publish到 vm .... 如果我手动进入项目文件夹并通过 启动 Kestrel dotnet app_name.dll,它可以完美运行,我可以从浏览器访问应用程序。
dotnet app_name.dll手动运行后我从终端得到的输出是
Hosting environment: Production
Content root path: /home/myUser/publish
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.
现在,教程要我使用 SystemD 来管理 Kestrel 进程。
它dotnet通过
ExecStart=/usr/bin/dotnet /var/aspnetcore/app_name.dll. 在服务文件中
当我启动该服务时,它看起来会起作用。我得到:
Hosting environment: Production
Content root path: /
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.
...但是当我尝试访问该应用程序时,红隼永远不会收到请求。我在两者之间看到的唯一区别是Content root path.
现在,在项目中,startup.cs 中引用了路径: …
将 Kestrel 与 IIS 一起使用时,您可以定义应用程序池和身份(用户)。默认身份是“ApplicationPoolIdentity”,但可以是以下之一或自定义用户:
当应用程序运行时,Kestrel 在您在 IIS 中定义的标识下运行:
但是,当在代理服务器(例如 nginx(或独立))后面使用 Kestrel 时,推荐使用的“身份”(用户)是什么以及如何将其与 Kestrel 一起使用?
.net-core kestrel-http-server asp.net-core asp.net-core-1.1 asp.net-core-2.0
我刚刚意识到 ASP.NET Core 应用程序不是纯粹的 CLR 应用程序——它们总是依赖于额外的二进制库:通过 Kestrel 的 libuv,或者可能不太常用的 http.sys。
我觉得这很令人惊讶,因为我原以为 .NET Core(以及 .NET Standard)下已经有足够的网络 api 来制作一个性能不错的 Web 服务器,纯粹在 .NET 中使用异步 IO - 但他们并没有走那条路.
所以:
WebClient,HttpRequest或者HttpClient不会用libuv,是否正确?编辑:
我查看了 Kestrel 源代码,除了一个名为的程序集之外,Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv还有一个名为Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets. 套接字程序集的相应 NuGet 包仅处于预览状态。(当然,套接字程序集不依赖于 libuv。)
Kestrel 有没有办法监听 2 个端口,例如 80 和 81,并为每个端口指定不同的控制器?
我的情况是有 2 个控制器,一个用于需要基于令牌的身份验证的最终用户请求,另一个控制器用于基于机器的代理,我想在其中强制执行基于客户端证书的身份验证。
我们有一个 ASP.NET Core 2.x 应用程序,它实现了自定义中间件,充当另一个(基于 Java 的)服务器/应用程序前面的代理。在服务器请求完成之前,此应用程序/中间件的客户端经常中止/取消他们的请求是很常见的。
我们已将此应用程序部署到 IIS(作为反向代理)并在 Kestrel 上运行。在 Core 2.x 之前,Kestrel 有一个错误,它HttpContext.RequestAborted总是导致false(这里有其他相关问题)......这显然在 2.x 中得到了修复(我已经能够确认)。
但是,似乎在 Kestrel 前面运行 IIS 时,它不会将请求中止转发到 Kestrel,RequestAborted并且仍然总是false
有什么方法可以RequestAborted在此配置中工作(或者如果没有,则可以通过任何其他方式检测它)?
简单复制仓库:https : //github.com/mikeomeara1/RequestAbortRepro
更新
此评论似乎表明了一个已知问题,但在多大程度上尚不清楚
这个问题似乎也是相关的,但对我来说,它的直接关系并不完全明显(至少它没有用这样的术语来说明)。
@spender - 如果我理解正确,标题比较在这里。如果没有,请告诉我,你想看什么我都给你。
茶叶似乎表明了一个已知问题。所以,问题是;有没有办法解决这个问题?我们刚刚经历了(一个非常痛苦的)1.1 到 2.x 的升级,希望这个问题能得到解决,让我们的服务器再运行一个月/季度/年让我们非常担心这一点。我们正在开发的系统在数量上大大增加。
因此,欢迎任何变通方法、黑客或疯狂的想法。
我们有一个在 .Net Framework V4.7.1 中运行的 ASP.net core 2.0 应用程序,使用 Kestrel 托管在 IIS 中。
该应用程序在大多数机器上运行良好,但是在我的机器上运行时它真的很慢。我已将应用程序精简为返回字符串的单个控制器,除 MVC 和日志记录中间件之外的所有内容都已删除。似乎在第 5 个 get 请求上,在控制器操作被击中之前有大约 30 秒的挂起。应用程序没有重新启动,它只是挂起。
有没有人遇到过类似的问题?谢谢
环境:ASP.NET Core 2.1,Ubuntu。
在旧式 ASP.NET 中,当我进行 bin 部署(例如上传一些 dll 文件)时,webapp 会检测到并重新加载自己 - 非常有用。
使用 Core,它不会那样做。我需要停止并重新启动该dotnet MyApp.dll过程。
如何让它检测对二进制文件的更改并重新加载?
asp.net ubuntu kestrel-http-server asp.net-core asp.net-core-2.1
我的应用程序中有一个 API 端点,它接受一个字符串作为 URL 参数,该参数可能包含/编码为%2f.
例如, GET http://localhost:5000/api/foo/some%2fstring
控制器操作在其编码状态 ( some%2fstring) 中接收此参数,并能够在其认为合适的情况下进行处理。
但是,一旦部署到 IIS,这就会中断。IIS 似乎在将 URL 传递给 Kestrel 之前对其进行解码。日志显示如下:
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
Request starting HTTP/1.1 GET http://example.com/api/foo/some/string application/json
Run Code Online (Sandbox Code Playgroud)
显然,该模式与路由和请求 404s 不匹配。
在将 URL 发送到 Kestrel 之前,如何防止 IIS 对其进行操作?