我想将ServiceStack的默认格式设置为JSON,而不是从浏览器访问服务时通常返回的HTML格式的响应。我知道这可以通过发送?format = json参数或将Accept标头设置为application / json在每个请求中指定。有没有办法改变这一点,而不必依赖请求中的这些提示?
答案 0 :(得分:44)
除了在QueryString上使用?format = json ,by appending the format .ext 在路径末尾指定它,例如:{{3通过指定HTTP标头(在您的HttpClient中):Accept: application/json
。
否则,如果您的HttpClient未发送Accept标头,您可以在AppHost中将JSON指定为默认内容类型:
SetConfig(new HostConfig {
DefaultContentType = MimeTypes.Json
});
ServiceStack中的所有配置选项都在此处设置。
从Web浏览器调用Web服务时的问题是,它们通常会询问Accept: text/html
而不是JSON,如果启用了,则返回HTML后,ServiceStack合同要求JSON。
为确保返回JSON,您可能还希望使用以下命令禁用HTML功能:
SetConfig(new HostConfig {
EnableFeatures = Feature.All.Remove(Feature.Html),
});
否则,如果您想覆盖Accept标头,可以强制您的服务始终使用以下任何方式将json返回/rockstars.json,例如:
使用过滤器(内置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);
答案 1 :(得分:2)
我使用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();
}
});
答案 2 :(得分:2)
问题的后期,但由于我无法在任何地方找到答案,我终于从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
。