3

ServiceStack 服务非常适合响应Accept标头中请求的内容类型。但是,如果我需要在请求过滤器中尽早关闭/结束响应,有没有办法以正确的内容类型进行响应?我在请求过滤器中只能访问原始 IHttpResponse 所以在我看来唯一的选择是繁琐地手动检查Accept标头并执行一堆 switch/case 语句来确定要使用哪个序列化程序然后直接编写到response.OutputStream.

为了进一步说明问题,在正常的服务方法中,您可以执行以下操作:

public object Get(FooRequest request)
{
    return new FooResponseObject()
    {
        Prop1 = "oh hai!"
    }
}

ServiceStack 将确定要使用的内容类型以及要使用的序列化程序。我可以在请求过滤器中做任何类似的事情吗?

4

1 回答 1

2

ServiceStack根据许多因素(例如 Accept: header、QueryString 等)预先计算 Requested Content-Type,并将此信息存储在httpReq.ResponseContentType属性中。

您可以将它与注册表一起使用,该IAppHost.ContentTypeFilters注册表在 ServiceStack 中存储所有注册的内容类型序列化程序的集合(即内置 + 自定义)并执行以下操作:

var dto = ...;
var contentType = httpReq.ResponseContentType;
var serializer = EndpointHost.AppHost
    .ContentTypeFilters.GetResponseSerializer(contentType);

if (serializer == null)
   throw new Exception("Content-Type {0} does not exist".Fmt(contentType));

var serializationContext = new HttpRequestContext(httpReq, httpRes, dto);
serializer(serializationContext, dto, httpRes);
httpRes.EndServiceStackRequest(); //stops further execution of this request

注意:这只是将响应序列化到输出流,它不会按照正常的 ServiceStack 请求执行任何其他请求或响应过滤器或其他用户定义的钩子。

于 2012-12-13T00:53:30.387 回答