覆盖NancyFx中响应的默认Content-Type

时间:2015-08-04 20:47:11

标签: c# nancy

我正在使用NancyFx编写REST API。我经常得到这样的代码:

Post["/something"] = _ => {
// ... some code
if (success) 
    return HttpStatusCode.OK;
else
    return someErrorObject;
};

客户端始终假定application/json为所有回复的内容类型。它实际上在请求中设置了Accept: application/json。没有application/json的回复是错误,无论实际的身体如何。它只是检查内容类型,如果它与json不匹配则中止。我无法改变这种行为。

现在我面临的问题是,简单地返回HttpStatusCode.OK Nancy设置Content-Type: text/html但是正如所说客户端假设application / json并且即使正文为空也会失败并显示错误。

我能够像这样强制内容类型:

return Negotiate
    .WithContentType("application/json")
    .WithStatusCode(HttpStatusCode.OK);

我不想在任何地方重复这段代码。当然,我可以在一个函数中抽象出来,但我正在寻找更优雅的解决方案。

有没有办法覆盖默认的内容类型的响应,以便return HttpStatusCode.OK将我的内容类型设置为application/json

1 个答案:

答案 0 :(得分:6)

基于想要将所有响应作为JSON返回的假设,您将需要一个自定义引导程序。如果您喜欢使用插入而不是清除响应处理器,则可以进一步增强此功能,因此可以使用XML处理器等的后备。

这将由Nancy自动选择,无需额外配置。

public class Bootstrap : DefaultNancyBootstrapper
{
    protected override NancyInternalConfiguration InternalConfiguration
    {
        get
        {
            return NancyInternalConfiguration.WithOverrides(
                (c) =>
                {
                    c.ResponseProcessors.Clear();
                    c.ResponseProcessors.Add(typeof(JsonProcessor));
                });
        }
    }
}