ServiceStack服务非常适合与同时申请的内容类型响应Accept
头。 但是,如果我需要关闭/从请求过滤器内提前结束的响应,是有办法用正确的内容类型回应? 我所访问的请求,过滤器是原始IHttpResponse所以在我看来,唯一的选择就是乏味,手工检查Accept
头,做了一堆开关/ case语句找出要使用的串行器,然后写直接向response.OutputStream
。
为了进一步说明这个问题,你可以做这样的事情提供正常的服务方法:
public object Get(FooRequest request)
{
return new FooResponseObject()
{
Prop1 = "oh hai!"
}
}
而ServiceStack会想出什么样的内容类型使用,要使用的串行器。 有什么与此类似,我可以请求过滤器内呢?
ServiceStack预先计算的一些因素所请求的内容,类型(例如接受:头,查询字符串,等等),它存储在这个信息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请求。
文章来源: What's the best way to respond with the correct content type from request filter in ServiceStack?