0

我对流和 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 使用自编程的 FileServer-Client。它有一个重用 FileServer-Connections 的选项。此连接将存储在池中。(池中只有未使用的 FileServer 连接)。如果下一个请求调用 GetFSClient() 它会从池中获取一个已连接的请求(并将其从池中删除)。

但是,如果另一个请求进来并使用池中的 FileServer-Connection(因为未使用),则仍然存在问题,即 Stream 可能正在使用中。

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

有没有一个切入点?

4

1 回答 1

2

Stream被视为易失性/临时性资源 - 难怪它实现了IDisposable.

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

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


更新

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

public HttpResponseMessage Get(HttpRequestMessage req, int fileId)
{
   ....
   req.RegisterForDispose(myStream);
}
于 2013-01-28T12:12:15.763 回答