我有两个控制器,一个提供下载文件的流,另一个允许删除文件。
当删除文件的请求进入时,我想中断流下载(从磁盘),以便删除该文件。
我尝试过组合取消令牌并将它们存储在IMemoryCache中。虽然我可以检索值并在CancellationTokenSource上调用取消,但它不会在另一个控制器上触发取消。
是否有某种机制可以阻止文件的流式传输以便删除它?
用例类似于YouTube,因为如果内容创建者想要删除他们的视频,YouTube会让您观看已经缓冲的内容,但是一旦删除请求就不允许您再播放视频进来了。
编辑:添加代码:
删除:
var cacheEntryOptions = new MemoryCacheEntryOptions().SetPriority(CacheItemPriority.NeverRemove).SetAbsoluteExpiration(TimeSpan.FromMinutes(30));
this.MemoryCache.Set(fileId, true, cacheEntryOptions);
我的想法是删除操作会向缓存中添加一些流操作可以检查的内容。
小溪行动:
while (!response.HttpContext.RequestAborted.IsCancellationRequested && bytesRemaining > 0)
{
if (this.MemoryCache.TryGetValue(this.FileId, out bool dummyValue))
{
throw new OperationCanceledException("Operation cancelled remotely");
}
}
使用RequestAborted
我希望如果客户端发出自己的取消请求,流将停止(它会停止)。
围绕while
我有一个尝试/捕获:
catch (OperationCanceledException cancelled)
哪个部署文件存取器。
我尝试使用CancellationTokens进行类似的操作并使用TokenSource进行组合,但调用cancel似乎什么也没做。
当前方法的问题在于,当调用删除操作时,似乎存在不处理对文件的访问的情况(即使在该调用中我睡了10分钟)。如果我在一分钟左右后进行后续呼叫(没有10分钟的延迟),则可以删除该文件。关于锁定文件的内容令人困惑,我觉得取消令牌可以解决这个问题......