为什么ASP Net Core 2.2不释放内存? - c#

我正在使用以下项目创建的默认项目来测试ASP Net Core 2.2:

Visual Studio>文件>新建>项目> ASP NET Core Web应用程序>下一步>创建。
在界面上按IIS Express按钮,然后自动转到https://localhost:44356/api/values

编辑:重点是,我正在测试ASP Net Core,以防人们发垃圾邮件。

我只修改了这个:

        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            return new string[] { "value1", "value2" };
        }

编辑:为此,我编辑了代码以进行合理测试,从而产生了最少的可复制示例

// GET api/values

[HttpGet]
public ActionResult<IEnumerable<Post>> Get()
{
    // Testing for brute force
    return Enumerable.Range(0, 100).Select(x => "Example Value").ToList();
}

起始进程内存为80 MB。

但是,当我尝试刷新页面时,启动内存不断增加:
为什么ASP Net Core 2.2不释放内存? - c#

编辑:原来这个问题从2年前就已经存在,没有解决方案,并且有Real Life Example Experience,
https://github.com/aspnet/AspNetCore/issues/1976

我很确定黄色箭头表示GC正常运行,但是我的进程内存使用率并未下降。
我不确定这是ASP Net Core的功能还是bug,我希望它在请求后/每次用户获取/ values都不会增加

编辑:我不希望人们危险地向我的应用程序发送垃圾邮件,并且由于内存泄漏它开始崩溃。如果此解决方案尚未修复,我恐怕会为我的公司使用Net Core。

为什么ASP Net Core 2.2不释放内存?

我曾尝试在两种不同的笔记本电脑中进行测试,结果是相同的。

编辑:我的同事也有这个问题。

编辑:我尝试使用点网核心v2.1,结果是相同的。

我已经尝试过GCCollect();结果是一样的。

旧图片参考。

Starting Process Memory

Process Memory keeps coming up

参考方案

我在同一个问题上挣扎。经过一番研究,我发现.NET Core可以分配新的内存空间。它将在必要时发布,但是此发布比其他发布对资源的要求更高,因为您必须以这种方式使用GC:

GC.Collect(2, GCCollectionMode.Forced, true);
GC.WaitForPendingFinalizers();

我的解决方案是创建一个中间件:

using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

namespace RegisterValidator
{
    public class GCMiddleware
    {
        private readonly RequestDelegate _next;

        public GCMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext httpContext)
        {
            await _next(httpContext);
            GC.Collect(2, GCCollectionMode.Forced, true);
            GC.WaitForPendingFinalizers();
        }
    }
}

编辑:此中间件将在每次调用后提供一个GC.Collect

并在Configure()Startup.cs方法中注册它:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider service, ILoggerFactory loggerFactory)
    {

        app.UseMiddleware<GCMiddleware>();
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseHsts();
        }

        app.UseStaticFiles();
        //app.UseHttpsRedirection();
        app.UseMvcWithDefaultRoute();

        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("\"No ");

        });
    }

也许还有另一种解决方案,但我还没有找到。希望对您有所帮助。

编辑:如果您不确定内存使用量是否是因为存在其他问题的大量分配空间,则可以使用dotMemory来比Visual Studio更加详细地描述内存使用情况。

如何在ASP.NET Core Web应用程序中增加JSON反序列化MaxDepth限制 - c#

我们正在将ASP.NET Core 2.1与.NET Framework 4.6.2结合使用。我们有一个客户需要向我们的Web应用程序发送一个很大程度上嵌套的json结构。当他们进行此调用时,我们将输出以下日志并返回错误: 读取器的MaxDepth超过了32。路径“ super.long.path.to property”,第1行,位置42111。”我浏览了…

ASP.NET MVC 5自定义登录,无需脚手架,数据库优先 - c#

我对asp.net和mvc还是很陌生,所以我正在努力学习尽可能多的知识...为此,我从头开始编写博客网站,但是我对身份验证和授权有些困惑。由于我倾向于不真正使用任何脚手架的东西,所以我首先要使用数据库,所以不希望asp.net身份为我创建表。我对散列和加盐密码很酷,并对照数据库检查用户,我遇到的麻烦是将用户设置为登录状态并检查他们应该能够访问什么。我真的很想…

asp.net oledbcommand返回所有行 - c#

我正在使用Oledbconnection连接到Microsoft Access数据库,并且正在使用OleDbCommand检索一些信息。我在数据库中有一个名为retrieveInfo的查询,该查询检索3行数据。字段中有一些重复项,但是应该是这样。我的数据如下所示: Name Email A [email protected] B [email protected] B C@gmai…

ASP.NET MVC在控制器中实施分析 - c#

我有这个控制器public ActionResult Download(Guid? codice) { if (codice == null) { return HttpNotFound(); } string _pathfile = "path-to-file"; byte[] fileBytes = System.IO.File.Re…

具有url-formencoded的模型属性自定义名称 - c#

我在webapi(.net核心2.1)中存在绑定问题。通常,当我使用xml / json时,我可以将属性添加到模型道具(通过XmlElement或JsonProperty)。但是我有一个项目使用application / x-www-form-urlencoded作为媒体类型,因此,这些模型仅在参数名称与属性名称匹配时才起作用(幸运的是,不区分大小写)。您能…