标签: kestrel-http-server

在 .net framework 4.5 上运行 kestrel webserver

如何在 .net framework 4.5.x 或 4.6.x 下运行的应用程序中托管 kestrel Web 服务器。目前我收到一个错误说

“无法加载 DLL 'libuv':找不到指定的模块。(来自 HRESULT 的异常:0x8007007E)

在 .net 4.xx 上运行 kestrel 具有作为嵌入式 Web 服务器的好处,可用于从 Windows 服务等提供网页。

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

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

在 ASP.NET Core 中修改静态文件响应

我在我的应用程序中提供了一堆静态文件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)

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

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

在 Ubuntu16.04 上使用 systemD 时,DotnetCore 内容根路径发生变化

我目前正在尝试按照本教程在 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 中引用了路径: …

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

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

Kestrel + .NET Core (Windows) 的推荐身份/用户

将 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

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

ASP.NET Core 和 Kestrel 设计决策:他们为什么使用 libuv?

我刚刚意识到 ASP.NET Core 应用程序不是纯粹的 CLR 应用程序——它们总是依赖于额外的二进制库:通过 Kestrel 的 libuv,或者可能不太常用的 http.sys。

我觉得这很令人惊讶,因为我原以为 .NET Core(以及 .NET Standard)下已经有足够的网络 api 来制作一个性能不错的 Web 服务器,纯粹在 .NET 中使用异步 IO - 但他们并没有走那条路.

所以:

  • 为什么使用 libuv 使东西更快?“因为异步 IO”本身并不能说明一切,因为 .NET 已经具备了这一点。
  • 为什么 Kestrel 没有在 .NET 的 IO 堆栈上运行的选项?在大多数情况下,速度差异不会那么重要,对吗?
  • 什么样的 IO 到底通过了性能更好的 libuv?我认为这只是入站请求。传出请求通过WebClientHttpRequest或者HttpClient不会用libuv,是否正确?

编辑:

我查看了 Kestrel 源代码,除了一个名为的程序集之外,Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv还有一个名为Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets. 套接字程序集的相应 NuGet 包仅处于预览状态。(当然,套接字程序集不依赖于 libuv。)

kestrel-http-server asp.net-core

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

Kestrel 服务器:如何将不同的端口绑定到不同的控制器?

Kestrel 有没有办法监听 2 个端口,例如 80 和 81,并为每个端口指定不同的控制器?

我的情况是有 2 个控制器,一个用于需要基于令牌的身份验证的最终用户请求,另一个控制器用于基于机器的代理,我想在其中强制执行基于客户端证书的身份验证。

kestrel-http-server asp.net-core

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

Kestrel + IIS 反向代理请求中止未触发

我们有一个 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 的升级,希望这个问题能得到解决,让我们的服务器再运行一个月/季度/年让我们非常担心这一点。我们正在开发的系统在数量上大大增加。

因此,欢迎任何变通方法、黑客或疯狂的想法。

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

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

ASP.net 核心应用程序挂在请求上

我们有一个在 .Net Framework V4.7.1 中运行的 ASP.net core 2.0 应用程序,使用 Kestrel 托管在 IIS 中。

该应用程序在大多数机器上运行良好,但是在我的机器上运行时它真的很慢。我已将应用程序精简为返回字符串的单个控制器,除 MVC 和日志记录中间件之外的所有内容都已删除。似乎在第 5 个 get 请求上,在控制器操作被击中之前有大约 30 秒的挂起。应用程序没有重新启动,它只是挂起。

有没有人遇到过类似的问题?谢谢

iis-10 kestrel-http-server asp.net-core-2.0

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

当 dll 文件更改时重新加载 ASP.NET Core 应用程序(bin 部署)

环境: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

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

停止 IIS 解码 URL 中的 %2f

我的应用程序中有一个 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 对其进行操作?

iis kestrel-http-server asp.net-core

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