如何更改ServiceStack中的默认ContentType?

时间:2012-09-07 23:56:19

标签: c# .net web-services rest servicestack

我在ServiceStack中有registered a new content type

appHost.ContentTypeFilters.Register("application/x-my-content-type", 
   SerializeToStream, DeserializeFromStream);

如果客户端在http流中发送内容类型,一切都按预期工作。

不幸的是,我的客户端不在我的HTTP Request Heads控制范围内,也没有发送内容类型。

如何让ServiceStack设置该路由的默认内容类型?

1 个答案:

答案 0 :(得分:9)

在每个ServiceStack /metadata page上列出客户端可以请求特定内容类型的不同方式:

  

要覆盖客户端中的内容类型HTTP 接受标题,请附加?format = xml 或添加。格式扩展名

E.g。客户可以使用?format = x-my-content-type 指定自定义ContentType,添加.x-my-content-type扩展名或指定HTTP标头(在HttpClient中):

  

接受:application / x-my-content-type

否则,如果您的HttpClient未发送Accept标头,您可以在AppHost中指定默认内容类型:

SetConfig(new HostConfig {
     DefaultContentType = "application/x-my-content-type"
});

注意:ServiceStack中的所有配置选项都设置在HostConfig

从Web浏览器调用Web服务时的问题是,如果启用了它,它们通常会根据ServiceStack合同要求Accept: text/html返回HTML。

为确保始终返回您的Content-Type,您可能还希望使用以下命令禁用HTML功能:

SetConfig(new HostConfig {
    EnableFeatures = Feature.All.Remove(Feature.Html),
});

否则,如果你想覆盖Accept 标题,你可以强制你的服务总是通过在HttpResult中装饰你的Response DTO来返回你的Content-Type,即:

return new HttpResult(dto, "application/x-my-content-type");

否则,在您的服务之外的任何地方(例如,请求/响应过滤器),您可以在任何可以访问IHttpRequest的地方设置响应内容类型:

httpReq.ResponseContentType = "application/x-my-content-type";