ServiceStack默认格式

时间:2012-04-25 13:55:59

标签: c# .net servicestack

我想将ServiceStack的默认格式设置为JSON,而不是从浏览器访问服务时通常返回的HTML格式的响应。我知道这可以通过发送?format = json参数或将Accept标头设置为application / json在每个请求中指定。有没有办法改变这一点,而不必依赖请求中的这些提示?

3 个答案:

答案 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