什么是与请求过滤器ServiceStack正确的内容类型作出回应的最好方式?(What's

2019-07-05 02:53发布

ServiceStack服务非常适合与同时申请的内容类型响应Accept头。 但是,如果我需要关闭/从请求过滤器内提前结束的响应,是有办法用正确的内容类型回应? 我所访问的请求,过滤器是原始IHttpResponse所以在我看来,唯一的选择就是乏味,手工检查Accept头,做了一堆开关/ case语句找出要使用的串行器,然后写直接向response.OutputStream

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

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

而ServiceStack会想出什么样的内容类型使用,要使用的串行器。 有什么与此类似,我可以请求过滤器内呢?

Answer 1:

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?