使用ServiceStack的IStreamWriter和IHasOptions进行错误处理

Chr*_*eau 5 servicestack

使用返回image/jpeg结果的IStreamWriter和IHasOptions的实现,如果WriteTo中发生错误,则不调用AppHost中的全局错误处理程序,并且image/jpeg标头保留,这会导致HTML错误(由ServiceStack生成) )使用image/jpeg HTTP标头.

这是一个如何重现这个的例子:

public class SampleStreamWriter : IStreamWriter, IHasOptions
{
    void WriteTo(Stream responseStream)
    {
        // This would actually be a delegate
        throw new ApplicationException("...");
    }

    public IDictionary<string, string> Options
    {
        get
        {
            return new Dictionary<string, string>
                {
                    {HttpHeaders.ContentType, "image/jpeg"}
                };
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

由于在WriteTo之前调用Options,因此无法在WriteTo中尝试/ catch并将Content-Type更改为例如"application/json",并手动覆盖错误响应.

如何实现这一点,以便HTTP响应具有错误的Content-Type值,并且作为奖励,AppHost的ServiceExceptionHandler被调用以进行日志记录?

paa*_*hpa 2

CompressedFileResult类可能是一个很好的示例,因为它继承了 IStreamWriter 和 IHasOptions 测试中使用的其他一些类也继承自 IStreamWriter(StreamWriterResultImageResult)。不确定这些是否有用。

看起来简单的答案是byte[]在调用“WriteTo”方法之前完成所有操作(验证、获取图像、构建等)。如果您Try/Catch在您的服务中,您可以将异常上推并使用已提供的异常处理。WriteTo显然,这在引发异常时没有帮助,但在管道中的这一点上,您似乎已经通过了响应操作点。