【发布时间】:2016-04-14 12:09:42
【问题描述】:
我们决定只允许带有 Content-Type 标头“application/json”的请求。 因此,每当我们收到带有替代或缺少 Content-Type 标头的请求时,我们都会抛出 HttpError。这应该返回一个 400 响应,其中包含带有相关信息的 JSON ResponseStatus 正文。 但是,如果发送 Content-Type text/plain,我们会抛出 HttpError,但响应的 Content-Type 是 text/plain 和 content-length: 0。我希望返回 ServiceStack 的 ResponseStatus。如果我将 Accept application/json 标头添加到请求中,则返回 ResponseStatus 正常。 我使用 Postman 执行了请求。 Fiddler4 屏幕截图:
我知道 Postman 添加了 Accept / 标头。所以我的问题是:无论请求的 Accept 标头如何,如何确保抛出的 HttpError 始终将 ResponseStatus 作为 JSON 返回?
SetConfig:
SetConfig(new HostConfig
{
EnableFeatures = Feature.All.Remove( Feature.Html | Feature.Csv | Feature.Jsv | Feature.Xml | Feature.Markdown | Feature.Razor | Feature.Soap | Feature.Soap11 | Feature.Soap12 | Feature.PredefinedRoutes),
DebugMode = false,
DefaultContentType = MimeTypes.Json
});
据我了解,DefaultContentType 仅在请求中没有 Accept 标头时使用。
PreRequestFilter:
PreRequestFilters.Add((request, response) =>
{
if (request.Verb.Equals("OPTIONS"))
response.EndRequest();
if (request.GetHeader("Content-Type") == null || !request.GetHeader("Content-Type").Equals(MimeTypes.Json))
throw new HttpError((int)HttpStatusCode.BadRequest, "Bad request", "Expected a Content-Type header with an application/json value but found none. See http://docsdomain.com/ for any required headers.");
});
【问题讨论】:
标签: json text servicestack http-error