我在ServiceStack中有registered a new content type:
appHost.ContentTypeFilters.Register("application/x-my-content-type",
SerializeToStream, DeserializeFromStream);
如果客户端在http流中发送内容类型,一切都按预期工作。
不幸的是,我的客户端不在我的HTTP Request Heads控制范围内,也没有发送内容类型。
如何让ServiceStack设置该路由的默认内容类型?
答案 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";