返回流而不处理它

时间:2017-02-02 19:54:46

标签: c# asp.net-mvc caching asp.net-web-api response

我的MVC / webApi计算要在文件中作为流返回的报告。计算需要相当长的时间,以便加快缓存的用户体验。返回后,流会自动处理。因此,为了使缓存工作,每次都必须将其复制到新的Stream对象。

由于我想缓存结果,我不希望它被处理掉。

我不知道文件是如何通过配置缓存的,因为它不是磁盘上的文件,而是根据输入按需计算。

那么如何将MVC / WebApi配置为不自动处理此响应? 它可能与OutgoingResponseContext有关,但在那里找不到任何可能做到的事情。

编辑,到目前为止添加了代码: 用于返回流的代码,每次将其作为引用传递时将其深度复制并将其作为文件返回。

public stream ConfigureResponseHeadersForFileStream(string input)
{
    // Calculate file
    var result = new CachedFile(input, CalculateFileContent());
    WebOperationContext.Current.OutgoingResponse.Headers.Clear();
    WebOperationContext.Current.OutgoingResponse.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    WebOperationContext.Current.OutgoingResponse.ContentLength = length;
    WebOperationContext.Current.OutgoingResponse.Headers.Add("Content-Disposition", "attachment; filename=" + "input");
    _cacher.Add(result);
    return result.Content;
}

public class CachedFile
{
    private Stream _content;
    public string Input;

    public long Length
    {
        get
        {
            return _content.Length;
        }
    }

    /// <summary>
    /// Will be copied into a new caching object.
    /// Because the web environment will dispose the stream that's returned to the user.
    /// </summary>
    public Stream Content
    {
        get
        {
            var stream = new MemoryStream();
            _content.CopyTo(stream);
            return stream;
        }

        set
        {
            _content = new MemoryStream();
            value.CopyTo(_content);
        }
    }

    public CachedFile(string input, Stream content)
    {
        Input = input;
        Content = content;
    }
}

0 个答案:

没有答案