NancyFx从IResponseProcessor返回406除了text/html内容类型
-
23-12-2019 - |
题
我在追南希 微软。欧文。主机。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");
};
更新后的: 我已经编辑了上面的代码,以显示正确的组合 IResponseProcessor
和 Negotiator
解决方案
这里更有趣的是,你的路线是什么样的?如果您希望它能够协商响应,那么您需要返回"谈判者`
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 字节的样板文件,这非常浪费。
参考