C# 分配给响应时自动协商内容

C# 分配给响应时自动协商内容,c#,nancy,C#,Nancy,分配给NancyContext.Response时,如何利用内容协商管道 当前我的IStatusCodeHandler.Handle方法返回JSON,而不考虑任何内容协商 我希望此方法根据任何内容协商使用JSON或XML(最好使用内容协商管道) 在默认引擎中,状态代码处理程序是在内容协商已经发生之后调用的。如果您使用的是0.23或更高版本,则内容协商部分已被拉入一个单独的服务中,并且可以在任何地方、任何时间使用,只要给定一个模型和上下文即可。使用此服务,您应该能够使用错误模型重新协商 大概是这样

分配给
NancyContext.Response
时,如何利用内容协商管道

当前我的
IStatusCodeHandler.Handle
方法返回JSON,而不考虑任何内容协商

我希望此方法根据任何内容协商使用JSON或XML(最好使用内容协商管道)


在默认引擎中,状态代码处理程序是在内容协商已经发生之后调用的。如果您使用的是0.23或更高版本,则内容协商部分已被拉入一个单独的服务中,并且可以在任何地方、任何时间使用,只要给定一个模型和上下文即可。使用此服务,您应该能够使用错误模型重新协商

大概是这样的:

public class MyStatusCodeHandler : IStatusCodeHandler
{
    private readonly IResponseNegotiator _negotiator;

    public MyStatusCodeHandler(IResponseNegotiator negotiator)
    {
        _negotiator = negotiator;
    }

    public bool HandlesStatusCode(HttpStatusCode statusCode, NancyContext context)
    {
        return statusCode == HttpStatusCode.NotFound;
    }

    public void Handle(HttpStatusCode statusCode, NancyContext context)
    {
        var error = new { StatusCode = statusCode, Message = "Not Found" };
        context.Response = _negotiator.NegotiateResponse(error, context);
    }
}

谢谢你的回复。但是,此代码会抛出一个
NullReferenceException
。我给你拍了一张堆栈跟踪的照片。当我传递一个字符串时不会抛出异常,尽管o.o可能是一个bug,这是Nancy问题跟踪器的事情,不是这样。无论如何,这就是解决问题的方法,也是Nancy在内部进行内容协商的方法。你的意思是说,在修复此bug之前,没有其他方法可以以这种方式使用内容协商管道?我将很快提交一个关于GH的问题。错误是因为
NancyContext
没有设置
NegotiationContext
。这是因为它是在
DefaultNancyModuleBuilder
中设置的,当您使用404时,它不会被点击。它应该适用于其他状态代码和其他位置。我提交了一个不合格的测试。同时,您只需设置
context.NegotiationContext=newnegotiationcontext()
,然后再将其传递给谈判者:)
public class MyStatusCodeHandler : IStatusCodeHandler
{
    private readonly IResponseNegotiator _negotiator;

    public MyStatusCodeHandler(IResponseNegotiator negotiator)
    {
        _negotiator = negotiator;
    }

    public bool HandlesStatusCode(HttpStatusCode statusCode, NancyContext context)
    {
        return statusCode == HttpStatusCode.NotFound;
    }

    public void Handle(HttpStatusCode statusCode, NancyContext context)
    {
        var error = new { StatusCode = statusCode, Message = "Not Found" };
        context.Response = _negotiator.NegotiateResponse(error, context);
    }
}