ServiceStack服务非常适合使用Accept
标头中请求的内容类型进行响应。但是,如果我需要在请求过滤器中提前关闭/结束响应,是否有办法以适当的内容类型进行响应?我在请求过滤器中访问的所有内容都是原始IHttpResponse,因此在我看来,唯一的选择是繁琐,手动检查Accept
标头并执行一堆switch / case语句来确定哪个序列化器使用然后直接写入response.OutputStream
。
为了进一步说明这个问题,在正常的服务方法中你可以这样做:
public object Get(FooRequest request)
{
return new FooResponseObject()
{
Prop1 = "oh hai!"
}
}
ServiceStack将确定要使用的内容类型以及要使用的序列化程序。我可以在请求过滤器中做类似的事吗?
答案 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请求执行任何其他请求或响应过滤器或其他用户定义的挂钩。