c# - Web API 2.0 方法中的内存泄漏

标签 c# asp.net-mvc-4 asp.net-web-api asp.net-web-api2 mongodb-.net-driver

我们项目中有一个webAPI,很简单,但是执行后不释放内存,每次执行都会增加使用的内存。

我使用 webAPI 2.0 和 MongoDB 作为后端服务器。

public class LogsController:ApiController
{
    BsonDocument __docs;
    IMongoDatabase __db;
    IMongoCollection<BsonDocument> __docsColl;
    [Route("api/Logs")]
    public async Task<int> Post(RequestData logs)
    {
        if (logs.Token == "I")
        {
            __db = new MongoClient(new MongoClientSettings
            {
                Server = new MongoServerAddress("serverIP", 27017),
                Credentials = new[] { MongoCredential.CreateCredential("database", "user name", "password") }
            }).GetDatabase("connect_database");

            __docs = new BsonDocument()
            {
                { "Customer",logs.Customer}
            };
            __docsColl = __db.GetCollection<BsonDocument>("InsertData");
            await __docsColl.InsertOneAsync(__docs);
        }
        logs = null;
        return 1;
    }

    protected override void Dispose(bool disposing)
    {
        __docs = null;
        __db = null;
        __docsColl = null;
        GC.SuppressFinalize(true);
        base.Dispose(disposing);
    }

}

我已经尝试了我找到的所有可能的解决方案,但到目前为止还没有成功。

最佳答案

当使用 post 参数调用 webAPI 时,它将反序列化为我们用作参数的类。

进一步检查发现,当类内容为字符串数据类型时,它会使用内存,并且不会在从 webAPI 返回响应后立即释放。

如果您确实需要内存,那么您必须重写 ApiController 的 Dispose 方法。

代码块应该是:

protected override void Dispose(bool disposing)
        {
            GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
            base.Dispose(disposing);
        }

GC.Collect 不是推荐的方法,但是当您在参数中发布大量数据时,您必须需要使用它来快速释放内存。

关于c# - Web API 2.0 方法中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48564330/

相关文章:

c# - Microsoft.EntityFrameworkCore.Design 未安装

c# - ASP.Net 相当于 openssl_private_decrypt 和 openssl_pkey_get_private

c# - 回滚时 Entity Framework InvalidOperationException

javascript - angularJS 路由(没有错误)不工作

ASP.NET MVC4 捆绑单个文件

asp.net-web-api - 使用 web api 自托管获取客户端的 IP 地址

c# - 401 的 ASP.NET WebApi 调用更改为 303 -> 400

c# - Java 和 C# 互操作性

c# - LINQ 平均时间跨度?

c# - ASCII 比较和字符串比较的区别