我在 ServiceStack中注册了一个新的内容类型:
appHost.ContentTypeFilters.Register("application/x-my-content-type",
SerializeToStream, DeserializeFromStream);
如果客户端在 http 流中发送内容类型,一切都会按预期工作。
不幸的是,我有一个不受 HTTP 请求头控制且不发送内容类型的客户端。
如何让 ServiceStack 为该路由设置默认内容类型?
我在 ServiceStack中注册了一个新的内容类型:
appHost.ContentTypeFilters.Register("application/x-my-content-type",
SerializeToStream, DeserializeFromStream);
如果客户端在 http 流中发送内容类型,一切都会按预期工作。
不幸的是,我有一个不受 HTTP 请求头控制且不发送内容类型的客户端。
如何让 ServiceStack 为该路由设置默认内容类型?
在每个 ServiceStack /metadata 页面上,都列出了客户端请求特定 Content-Type 的不同方式:
要覆盖客户端 HTTP Accept Header中的 Content-type,请附加?format=xml或 add 。格式扩展
例如,客户端可以使用?format=x-my-content-type指定您的自定义 ContentType ,添加.x-my-content-type扩展名或通过指定 HTTP 标头(在 HttpClient 中):
接受:应用程序/x-my-content-type
否则,如果您的 HttpClient 不发送 Accept 标头,您可以在 AppHost 中指定默认内容类型:
SetConfig(new HostConfig {
DefaultContentType = "application/x-my-content-type"
});
注意:ServiceStack 中的所有配置选项都设置在HostConfig.
从 Web 浏览器调用 Web 服务时的问题是,它们通常会Accept: text/html根据合同要求 ServiceStack 通过返回 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");
否则,在您的服务之外的任何地方(例如请求/响应过滤器),您都可以在任何可以访问 a 的地方设置响应内容类型IHttpRequest:
httpReq.ResponseContentType = "application/x-my-content-type";