首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在ASP.NET内核中流式传输和部署IEnumerable

在ASP.NET内核中流式传输和部署IEnumerable
EN

Stack Overflow用户
提问于 2018-12-07 22:33:51
回答 1查看 365关注 0票数 1

我正在尝试在ASP.NET核心中实现一个控制器,它返回从SQL数据库查询的潜在的大量数据。为此,我使用buffered: false参数通过Dapper的Query()方法执行查询。这意味着必须在枚举查询结果之后释放SqlConnection对象。

似乎没有一种简单的方法来实现这一点。我通过编写一个包装IEnumerable的类来让它正常工作,reference计算它被要求创建的任何枚举数。当所有枚举器都被释放后,它就会释放数据库连接。

这似乎是可行的,但我担心在某些情况下,数据库连接不会被释放(例如,如果请求在开始枚举查询结果之前被取消)。除了写入临时文件并将其流式传输到客户端之外,还有更好的方法吗?

EN

回答 1

Stack Overflow用户

发布于 2018-12-08 00:27:17

这就是我最后想出来的。连接的生存期归代替通常的ObjectResult返回的StreamedDatabaseObjectResult所有。repository类返回要处置的连接以及结果。这似乎涵盖了所有的情况,并且很好地使用了异步方法。

代码语言:javascript
代码运行次数:0
运行
复制
public class StreamedDatabaseObjectResult : ActionResult
{
    private readonly Func<Task<DisposableEnumerable>> _getValuesFunc;

    public StreamedDatabaseObjectResult(Func<Task<DisposableEnumerable>> getValuesFunc)
    {
        _getValuesFunc = getValuesFunc;
    }

    public override async Task ExecuteResultAsync(ActionContext context)
    {
        using (var de = await _getValuesFunc())
        {
            var objectResult = new ObjectResult(de.Values);
            await objectResult.ExecuteResultAsync(context);
        }
    }
}

public class DisposableEnumerable : IDisposable
{
    public IEnumerable Values { get; }
    private readonly IDisposable _disposable;

    public DisposableEnumerable(IDisposable disposable, IEnumerable values)
    {
        Values = values;
        _disposable = disposable;
    }

    /// <inheritdoc />
    public void Dispose()
    {
        _disposable.Dispose();
    }
}

[HttpGet]
[ProducesResponseType(200)]
public ActionResult<IEnumerable<MyClass>> GetThings(CancellationToken cancellationToken)
{
    return new StreamedDatabaseObjectResult(() => _repo.GetThings(cancellationToken));
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53671603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档