使用Pushstreamcontent时处理错误的正确方法是什么?
我使用Pushstreamcontent将数据直接从数据库流传输到客户端。
在客户端上,当接收结果时,我使用HttpCompletionOption.ResponseHeadersRead。
如果数据不可用,我想返回一个HttpStatusCode 404 (未找到)。
目前,我仅在执行lambda(CopyBinaryValueToResponseStream)期间检测到没有数据。
在那时,我无法再更改HttpResponeMessage的状态。
那么处理此类情况的正确方法是什么?我想避免在数据库中进行额外的检查,但是现在看来这是完成它的唯一方法?
[Route("{id}")]
public HttpResponseMessage GetImage(int id)
{
HttpResponseMessage resp = new HttpResponseMessage();
// do I need to check here first if the data is available?
// and return 404 if the data is not available
// resp.StatusCode = HttpStatusCode.NotFound
// or can I handle it later from within the lambda?
resp.Content = new PushStreamContent(async (responseStream, content, context) =>
{
// what if an error happens in this function? who do I get that error to the client?
await CopyBinaryValueToResponseStream(responseStream, id);
});
return resp;
}
最佳答案
您不能在PushStreamContent操作中修复它。在执行操作时,您已经开始发送响应,因此已经发送了200。这是PushStreamContent的缺点。
如果您有某种方法可以在流传输之前检测到资源不存在(例如,如果某个文件不存在),则可以先检测到该资源并返回404,即在这种情况下根本不使用PushStreamContent。
[Route("{id}")]
public HttpResponseMessage GetImage(int id)
{
HttpResponseMessage resp = new HttpResponseMessage();
if (File.Exists(@"c:\files\myfile.file"))
{
resp.StatusCode = HttpStatusCode.NotFound;
return resp;
}
// file exists - try to stream it
resp.Content = new PushStreamContent(async (responseStream, content, context) =>
{
// can't do anything here, already sent a 200.
await CopyBinaryValueToResponseStream(responseStream, id);
});
return resp;
}
关于c# - WebApi PushStreamContent错误处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33562099/