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

本文关键字:默认 Content-Type 响应 NancyFx 覆盖 | 更新日期: 2023-09-27 18:06:26

我正在用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南希设置Content-Type: text/html,但正如所说,客户端假设应用程序/json和失败的错误,即使主体是空的。

我可以像这样强制内容类型:

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

我不想到处重复这段代码。当然,我可以将其抽象为一个函数,但我正在寻找一个更优雅的解决方案。

是否有一种方法可以覆盖响应的默认内容类型,以便return HttpStatusCode.OK将我的内容类型设置为application/json ?

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

基于希望以JSON形式返回所有响应的假设,您将需要一个自定义引导程序。如果您愿意,可以通过使用插入而不是清除响应处理器来进一步增强这一点,因此可以使用XML处理器等进行回退。

这将被Nancy自动拾取,不需要额外的配置。

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