ASP.NET Web API:请求后委托



我在流和Web API方面有问题。

我返回由 Web API 使用的流。目前,我在获得流后将套接字放入池中。但这会导致一些错误。

现在,我必须在请求结束后将套接字放入池中。(流已消耗,现已关闭)。

是否有此或其他最佳实践的委托?

示例代码:

public HttpResponseMessage Get(int fileId)
{
HttpResponseMessage response = null;
response = new HttpResponseMessage(HttpStatusCode.OK);
Stream s = GetFile(id);
response.Content = new StreamContent(fileStream);
}
GetFile(int id)
{
FSClient fs = GetFSClient();
Stream s = fs.GetFileStream(id);
AddFSToPool(fs);
return s;
}

GetFile使用自编程的文件服务器客户端。它有一个重用文件服务器连接的选项。此连接将存储在池中。(池中只有未使用的文件服务器连接)。如果下一个请求调用 GetFSClient(),它会从池中获取一个连接的请求(并将其从池中删除)。

但是,如果另一个请求进入并使用池中的文件服务器连接(因为未使用),仍然存在问题,即流可能正在使用中。

现在我想在请求结束并且流完全消耗后执行"将 FSClint 放入池中"。

有切入点吗?

Stream被视为

易失性/临时资源 - 难怪它实现了IDisposable

此外,Stream不是线程安全的,因为它有一个Position这意味着如果它被读取到最后,它应该重置回开始,如果两个线程读取流,它们很可能会读取不同的

因此,我什至不会尝试解决这个问题。不建议在网站上重用流(本质上是多用户/多线程)。


更新

正如我所说,仍然认为最好的选择是重新考虑解决方案,但如果您需要注册在请求完成后运行的内容,请根据请求使用 RegisterForDispose

public HttpResponseMessage Get(HttpRequestMessage req, int fileId)
{
   ....
   req.RegisterForDispose(myStream);
}

相关内容

  • 没有找到相关文章

最新更新