WebApi PushStreamContent错误处理

本文关键字:处理 错误 PushStreamContent WebApi | 更新日期: 2023-09-27 18:20:44

使用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;
    }

WebApi PushStreamContent错误处理

您无法在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;
}