我正在尝试使用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表达式似乎是针对任何不是MyCustomType或application / json的接受头调用的。因此,如果我传递“text / html”,它会得到一个有效的响应,这不是我想要的。我希望* / *仅在客户端在accept头中传递* / *时才匹配,而不是任何其他accept头类型的catch-all。
答案 0 :(得分:0)
要使其工作,您需要添加一个BeforeHook来检查Headers并决定是否允许它通过或不通过。这样的事情
pipelines.BeforeRequest += (ctx) => {
return <null or a Response object>;
};
null
允许请求通过,Response
将BAD REQUEST