Автоматическая проверка содержимого при назначении ответа

Как использовать преимущества конвейера согласования контента при назначении NancyContext.Response?

В настоящее время мой IStatusCodeHandler.Handle Метод возвращает JSON независимо от согласования содержимого.

Я хочу, чтобы этот метод использовал JSON или XML в соответствии с любым согласованием контента (предпочтительно с использованием конвейера согласования контента).

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

1 ответ

Решение

В стандартном движке Nancy обработчики кода состояния вызываются после того, как согласование содержимого уже выполнено. Если вы используете версию 0.23 или новее, части согласования контента были извлечены в отдельный сервис и могут использоваться где угодно, в любое время, только с учетом модели и контекста. Используя этот сервис, IResponseNegotiator, вы должны быть в состоянии пересмотреть, используя модель ошибки.

Что-то вроде этого:

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);
    }
}
Другие вопросы по тегам