我在追南希 微软。欧文。主机。IIS (赫利俄斯)。

我试图通过有线连接conneg IResponseProcessor 回应 Accept 标题的 text/plain, ,但它只会返回406。

我已经尝试了多种内容类型,没有任何工作。...除了,奇怪的是, text/html (清除基地后 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
        };
    }
}

然后,在模块:

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

更新后的: 我已经编辑了上面的代码,以显示正确的组合 IResponseProcessorNegotiator

Github来源

有帮助吗?

解决方案

这里更有趣的是,你的路线是什么样的?如果您希望它能够协商响应,那么您需要返回"谈判者`

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

如果你还一个平原 Response (或任何可以隐式转换为响应的内容,例如string,int,HttpStatusCode或Action),那么您将完全按照此处所述规避内容协商 https://github.com/NancyFx/Nancy/wiki/Content-Negotiation.

如果要返回视图,请使用 View[..] 那么你是说唯一允许的媒体范围是 text/html

其他提示

Conneg 是一个寻找问题的解决方案:

HTTP 内容协商有四个轴:按格式协商(Accept)、按字符编码协商(Accept-Charset)、按自然语言协商(Accept-Language)和按压缩协商(Accept-Encoding)。这些轴需要单独讨论。

  • 按格式协商(接受)

作为网络作者,你不能依赖格式协商,因为总有客户接受他们没有声明的东西。由于上一点,如果您是一个浏览器供应商,而另一个供应商提供的浏览器没有声明它支持它所支持的某些内容,那么您浪费字节来声明它也是没有意义的,因为网络作者无论如何不能(仅仅)依赖该声明。

  • 通过字符编码协商(Accept-Charset)

在主要浏览器中,只有 Chrome 不再发送 Accept-Charset

  • 通过自然语言进行协商(Accept-Language)

当网站确实有多种语言版本时,这些版本通常不相同。通常,一种语言是网站的主要语言,而其他语言版本不完整、过时或质量较低。即使每个人都在浏览器中配置了自己的语言首选项,在某些情况下,该人可以阅读的语言组合也会将世界人口划分为相当小的桶,从而使语言组合成为识别特定用户或小群体的方式用户数。由于人们很少配置他们的语言首选项,因此当有人配置它时,该配置很可能变得唯一或几乎唯一标识。这可以被视为隐私问题。

  • 通过压缩协商(Accept-Encoding)

如今,所有主要浏览器都支持 gzip 压缩响应。从这个意义上说,该功能是成功的。然而,每个请求最终都包含 23 字节的样板文件,这非常浪费。

参考

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top