我在流和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);
}