我的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;
}
}