ServiceStack默认格式
我想将ServiceStack的默认格式设置为JSON,而不是从浏览器访问服务时通常返回的HTML格式的响应。 我知道这可以通过发送?format = json参数或将Accept标头设置为application / json来指定每个请求。 有没有办法改变这一点,而不必依赖请求中的这些提示?
除了在带有?format = json的QueryString上指定它之外,还可以将格式 .ext 附加到 路径的末尾,例如: /rockstars.json ,或者通过指定HTTP Header(在您的HttpClient中): Accept: application/json
。
否则,如果您的HttpClient未发送Accept标头,您可以在AppHost中将JSON指定为默认内容类型:
SetConfig(new HostConfig { DefaultContentType = MimeTypes.Json });
ServiceStack中的所有配置选项都在此处设置。
从Web浏览器调用Web服务时的问题是,它们通常会要求Accept: text/html
而不是JSON,如果启用了ServiceStack合同,则返回HTML。
要确保返回JSON,您可能还希望禁用HTMLfunction:
SetConfig(new HostConfig { EnableFeatures = Feature.All.Remove(Feature.Html), });
指定响应内容类型的不同方法
否则,如果要覆盖Accept标头,可以强制服务始终使用以下任何方式返回json以自定义HTTP响应 ,例如:
使用filter(内置AddHeader):
[AddHeader(ContentType=MimeTypes.Json)] public object Any(Request request) { ... }
在服务中设置响应:
public object Any(Request request) { base.Response.ContentType = MimeTypes.Json; return dto; }
返回装饰响应:
return new HttpResult(dto, MimeTypes.Json);
我使用PreRequestFilter强制JSON响应到浏览器。 你仍然在查询字符串上看到?format = json,但是如果你禁用了html和xml它会很有用。
this.PreRequestFilters.Add( (req, res) => { const string queryString = "format=json"; var jsonAccepted = req.AcceptTypes.Any(t => t.Equals(ContentType.Json, StringComparison.InvariantCultureIgnoreCase)); var jsonSpecifiedOnQuerystring = !string.IsNullOrEmpty(req.QueryString["format"]) && req.QueryString["format"].Equals("json", StringComparison.InvariantCultureIgnoreCase); if (!jsonAccepted && !jsonSpecifiedOnQuerystring) { var sb = new StringBuilder(req.AbsoluteUri); sb.Append(req.AbsoluteUri.Contains("?") ? "&" : "?"); sb.Append(queryString); res.RedirectToUrl(sb.ToString(), HttpStatusCode.SeeOther); res.Close(); } });
问题的后期,但由于我无法在任何地方找到答案,我终于从ServiceStack的源代码中找到了它:)
我发现从浏览器中默认使用Json而不是Html的最简单方法是:
HttpRequestExtensions.PreferredContentTypes = new[] { MimeTypes.Json, MimeTypes.Xml };
在你的应用程序启动时调用它,它将覆盖默认的ServiceStack mime类型,并从json开始(这将与浏览器的请求一起使用,因为/将匹配它)。
请注意,您仍应禁用Html并使Json成为默认的mime类型:
SetConfig(new HostConfig { DefaultContentType = MimeTypes.Json EnableFeatures = Feature.All.Remove(Feature.Html), });
对于好奇 :ServiceStack在内部使用HttpRequestExtensions.GetResponseContentType
(请参阅HttpRequestExtensions.cs
),它循环遍历首选内容类型。 因为它包含MimeTypes.Html
,它将从浏览器中捕获第一个接受类型( text/html
)并忽略后来发生的任何事情。 通过覆盖它, text/html
不被视为首选内容类型,然后跳转到*/*
,默认为json
如预期的那样。