Pregunta

Estoy corriendo en Nancy Microsoft.Owin.Host.IIS (Helios).

Estoy tratando de conectar a través de conneg IResponseProcessor para responder a una Accept encabezado de text/plain, pero sólo devolverá 406.

He probado con varios tipos de contenido, y nada funciona....EXCEPTO, curiosamente, text/html (después de borrar la 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
        };
    }
}

Luego, en el módulo:

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

ACTUALIZADO: He editado el código de arriba para mostrar la combinación adecuada de IResponseProcessor y Negotiator

Fuente De Github

¿Fue útil?

Solución

La cosa más interesante aquí es, ¿qué hace su rutas parecen?Si usted quiere ser capaz de negociar la respuesta, entonces usted necesita para volver un " Negociador`

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

Si el retorno de una llanura Response (o cualquier cosa que se puede convertir implícitamente una Respuesta, como string, int, HttpStatusCode o Acción), entonces usted va a eludir el contenido de la negociación en su totalidad como se describe aquí https://github.com/NancyFx/Nancy/wiki/Content-Negotiation.

Si desea devolver un punto de vista, el uso de View[..] entonces usted está diciendo que el único permitido que los medios de comunicación es la gama de text/html

Otros consejos

CONNEG es una solución que busca un problema:

La negociación de contenido HTTP tiene cuatro ejes: negociación por formato (aceptar), negociación por codificación de caracteres (aceptación de caracteres), negociación por lenguaje natural (aceptación de lenguaje) y negociación por compresión (codificación aceptable). Estos ejes deben ser discutidos por separado.

  • Negociación por formato (aceptar)

No puede confiar en la negociación de formato como autor web, porque siempre hay clientes que aceptan algo que no declaran. Debido al punto anterior, si usted es un proveedor del navegador y otro proveedor ha enviado un navegador que no declara que apoya algo que admite, tampoco tiene sentido perder los bytes que lo declaran, ya que los autores web No se puede confiar (únicamente) en la declaración de todos modos.

  • Negociación por codificación de caracteres (aceptable-caracter)

de los principales navegadores, solo Chrome envía Acepte-Chartsets,

  • negociación por lenguaje natural (aceptable-idioma)

Cuando los sitios tienen versiones en varios idiomas, las versiones a menudo no son iguales. Típicamente, un idioma es el idioma principal para el sitio y las versiones de otros idiomas están incompletas, desactualizadas o de baja calidad. Incluso si todos configuraron con sus preferencias de idioma en su navegador, la combinación de idiomas que la persona puede leer particionaría a la población del mundo en cubos bastante pequeños en algunos casos, lo que hace que la combinación de idiomas sea la forma de identificar a un usuario en particular o un grupo pequeño. de los usuarios. Dado que las personas rara vez configuran su preferencia de idioma, cuando alguien lo configura, es probable que la configuración sea identificada de forma única o casi única. Esto se puede ver como un problema de privacidad.

  • Negociación por compresión (Aceptar-codificación)

En estos días, todos los principales navegadores admiten respuestas gziadas. En ese sentido, la característica es un éxito. Sin embargo, es terriblemente inundado que cada solicitud termine con 23 bytes de placa de calderas.

referencias

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top