1

使用 ServiceStack 3.9.2x。

开箱即用(如元数据页面所示)服务堆栈内置了对一堆内容类型的支持 - xml、json、jsv 等。告诉 ServiceStack 限制支持的集合的最佳方法是什么内容。例如,我的服务只知道如何说 JSON,并且我不希望 ServiceStack 尊重带有“Content-type: application/xml”或“Accept: application/xml”标头的请求。在这种情况下,我希望 ServiceStack 以 406(不可接受)响应进行响应,理想情况下,在正文中包含支持的内容集(根据 HTTP 1.1 规范)。

此外,ServiceStack 是如何决定不包含 Accept 或 Content-Type 标头的请求的默认内容类型(我想我现在看到它呈现 HTML)?有没有办法告诉 ServiceStack 在这些情况下采用特定的内容类型?

4

1 回答 1

2

请参阅此答案以了解如何在 ServiceStack 中设置默认内容类型:ServiceStack 默认格式

您可以使用请求过滤器来检测请求的内容类型:

httpReq.ResponseContentType

在您的全局请求过滤器中,您可以选择允许它(什么都不做)或直接写入响应,例如 406 以及您希望的支持内容列表。

ServiceStack 操作顺序

实现架构图显示了 ServiceStack 中发生的操作顺序的视觉提示。在哪里:

  1. EndointHostConfig.RawHttpHandlers在其他任何事情之前执行,即返回任何 ASP.NETIHttpHandler完全绕过 ServiceStack。
  2. IAppHost.PreRequestFilters请求 DTO 反序列化之前执行
  3. 优先级 < 0请求过滤器属性被执行
  4. 然后执行任何全局请求过滤器
  5. 后跟优先级 >= 0请求过滤器属性
  6. 操作请求过滤器(仅限新 API)
  7. 然后你的服务被执行
  8. 操作响应过滤器(仅限新 API)
  9. 紧随其后的是优先级 < 0的响应过滤器属性
  10. 然后是全局响应过滤器
  11. 紧随其后的是优先级 >= 0的响应过滤器属性

每当您在任何过滤器中关闭响应时,即httpRes.Close()响应的处理是短路的,并且不会对该请求进行进一步的处理。

于 2012-11-05T20:48:37.767 回答