Confusion over NancyFx MediaRange

本文关键字:MediaRange NancyFx over Confusion | 更新日期: 2023-09-27 18:08:27

我试图创建一个WebAPI与南希,只响应某些接受头类型。我想要的是回复自定义的接受类型,application/json,或者如果客户端添加了*/*作为接受头,在这种情况下,我也会在这里返回json。

我认为这样做可以解决我的问题(为了简洁/保密,我省略了一些代码):

return this.Negotiate
            .WithMediaRangeResponse(new MediaRange("MyCustomType"), () => return new Response() {....})
            .WithMediaRangeResponse(new MediaRange("application/json"), () => return new Response() {....})
            .WithMediaRangeResponse(new MediaRange("*/*"), () => return new Response() {....})

我预计给定这段代码,如果接受头包含MyCustomType,那么第一个表达式将被执行,或者,如果接受头包含application/json或*/*,那么它们各自的表达式将被执行。如果请求没有这三个值中的任何一个,则会发生另一个操作(还没有弄清楚如何默认为BAD request)。

然而,似乎正在发生的是*/* MediaRange表达式似乎被称为任何接受头不是MyCustomType或application/json。所以如果我传递"text/html"它会得到一个有效的响应,这不是我想要的。我希望*/*仅在客户端在接受标头中传递*/*而不是任何其他接受标头类型的情况下才匹配。

Confusion over NancyFx MediaRange

要做到这一点,你需要添加一个BeforeHook来检查Headers,并决定是否允许它通过。像这样pipelines.BeforeRequest += (ctx) => { return <null or a Response object>; };其中null将允许请求通过,Response将是BAD REQUEST