对NancyFx MediaRange

时间:2016-09-23 16:03:12

标签: c# .net nancy

我正在尝试使用Nancy创建一个仅响应某些接受标头类型的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() {....})

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

但是,似乎正在发生的事情是,* / * MediaRange表达式似乎是针对任何不是M​​yCustomType或application / json的接受头调用的。因此,如果我传递“text / html”,它会得到一个有效的响应,这不是我想要的。我希望* / *仅在客户端在accept头中传递* / *时才匹配,而不是任何其他accept头类型的catch-all。

1 个答案:

答案 0 :(得分:0)

要使其工作,您需要添加一个BeforeHook来检查Headers并决定是否允许它通过或不通过。这样的事情 pipelines.BeforeRequest += (ctx) => { return <null or a Response object>; }; null允许请求通过,ResponseBAD REQUEST