5

使用返回 image/jpeg 结果的 IStreamWriter 和 IHasOptions 的实现,如果 WriteTo 发生错误,则不会调用 AppHost 中的全局错误处理程序,并且图像/jpeg 标头保持不变,这会导致 HTML 错误(由 ServiceStack 生成) 带有图像/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"}
                };
        }
    }
}

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

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

4

1 回答 1

2

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

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

于 2013-05-13T21:51:35.110 回答