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如预期的那样。