在ServiceStack中使用请求过滤器响应正确内容类型的最佳方法是什么?

时间:2012-12-13 00:31:35

标签: servicestack

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

为了进一步说明这个问题,在正常的服务方法中你可以这样做:

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

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

1 个答案:

答案 0 :(得分:2)

ServiceStack预先计算了许多因素(例如,Accept:header,QueryString等)的请求内容类型,它将此信息存储在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请求执行任何其他请求或响应过滤器或其他用户定义的挂钩。