Pergunta

Eu estou correndo em Nancy A Microsoft.Owin.Host.O IIS (Helios).

Eu estou tentando conectar via conneg IResponseProcessor para responder a uma Accept cabeçalho de text/plain, mas ele só vai retornar 406.

Eu tentei vários tipos de conteúdo, e nada funciona....EXCETO, estranhamente, text/html (depois de limpar a base de ViewProcessor).

public class ViewApiProcessor : IResponseProcessor
{
    private readonly IViewFactory viewFactory;

    public ViewApiProcessor(IViewFactory _viewFactory)
    {
        this.viewFactory = _viewFactory;
    }

    private static readonly IEnumerable<Tuple<string, MediaRange>> extensionMappings =
    new[] { new Tuple<string, MediaRange>("txt", MediaRange.FromString("text/plain")) };

    public IEnumerable<Tuple<string, MediaRange>> ExtensionMappings
    {
        get { return extensionMappings; }
    }

    public ProcessorMatch CanProcess(MediaRange requestedMediaRange, dynamic model, NancyContext context)
    {

        bool matchingContentType =
            requestedMediaRange.Matches("text/plain");

        return matchingContentType
            ? new ProcessorMatch { ModelResult = MatchResult.DontCare, RequestedContentTypeResult = MatchResult.ExactMatch }
            : new ProcessorMatch();
    }

    public Response Process(MediaRange requestedMediaRange, dynamic model, NancyContext context)
    {
        context.ViewBag.RequestType = "api";

        var response = (Response)this.viewFactory.RenderView(context.NegotiationContext.ViewName, model, GetViewLocationContext(context));

        return response.WithContentType("text/plain");
    }

    private static ViewLocationContext GetViewLocationContext(NancyContext context)
    {
        return new ViewLocationContext
        {
            Context = context,
            ModuleName = context.NegotiationContext.ModuleName,
            ModulePath = context.NegotiationContext.ModulePath
        };
    }
}

Em seguida, no módulo:

Get["/"] = p => 
{
    return Negotiate.WithView("Index");
};

ATUALIZADO: Eu ter editado o código acima para mostrar a combinação apropriada de IResponseProcessor e Negotiator

O Github Origem

Foi útil?

Solução

O mais interessante aqui é, o que faz o seu rotas parece?Se você deseja que ele seja capaz de negociar a resposta, em seguida, você precisa retornar um " Negociador`

Get["/"] = _ => {
   return Negotiator.WithModel(...).WithView("foo");
};

Se você retornar um simples Response (ou qualquer coisa que pode ser implicitamente convertido para um Resposta, como string, int, HttpStatusCode ou Ação), então você vai contornar a negociação de conteúdo inteiramente como descrito aqui https://github.com/NancyFx/Nancy/wiki/Content-Negotiation.

Se você estiver retornando um modo de exibição, usando View[..] então você está dizendo que a permitida somente a mídia gama é text/html

Outras dicas

Conneg é uma solução procurando por um problema:

HTTP negociação de conteúdo tem quatro eixos:negociação por formato (Aceitar), a negociação pela codificação de caracteres (Accept-Charset), negociação através de linguagem natural (Accept-Language) e negociação por compressão (Accept-Encoding).Esses eixos devem ser discutidos separadamente.

  • Negociação por formato (Aceitar)

Você não pode confiar em formato de negociação como autor de Web, porque há sempre clientes que aceitar algo que não declarar.Devido ao ponto anterior, se você for um fornecedor de navegador e de outro fornecedor tem fornecido um navegador que não é declarar que ele oferece suporte a algo que ele suporta, não faz sentido para você resíduos bytes declarando, também, porque os autores da Web não pode confiar (exclusivamente) na declaração de qualquer maneira.

  • Negociação pela codificação de caracteres (Accept-Charset)

Os principais navegadores, apenas o Chrome envia Accept-Charset mais

  • Negociação através de linguagem natural (Accept-Language)

Quando os sites não tem versões em diversos idiomas, versões, muitas vezes, não são iguais.Normalmente, um idioma é o idioma principal do site e outras versões de idioma estão incompletos, desatualizados, ou de outra forma de baixa qualidade.Mesmo se todos configurado com suas preferências de idioma em seu navegador, a combinação de idiomas que a pessoa pode ler partição da população do mundo, ao invés de pequenos baldes, em alguns casos, tornando a combinação de línguas, a forma de identificar um usuário específico ou um pequeno grupo de usuários.Uma vez que as pessoas tão raramente configurar a sua preferência de idioma, quando alguém faz configurá-lo, as chances são de que a configuração torna-se exclusivamente ou quase exclusivamente de identificação.Isto pode ser visto como um problema de privacidade.

  • Negociação por compressão (Accept-Encoding)

Estes dias, todos os principais navegadores o apoio do arquivo de respostas.Nesse sentido, o jogo é um sucesso.No entanto, é muito desperdício que cada pedido acaba com 23 bytes de clichê.

Referências

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top