【发布时间】:2020-03-18 23:33:50
【问题描述】:
我目前正在尝试使用功能、管道和拦截器实现以下模式:
auth {
limit(1) {
get {
call.respond("Cake1")
}
}
}
在这两个功能中,我都使用了这个:
pipeline.insertPhaseAfter(ApplicationCallPipeline.Features, myCustomPhase)
pipeline.intercept(appTokenAuthPhase)
我遇到以下两个问题:
- 使用 PhaseAfter 时,顺序错误。应该首先调用 Auth,其次应该调用 Limit。为什么是限制第一?我怎样才能防止这种情况?注意:它应始终取决于代码顺序,应首先执行第一个块。由于某些未知的原因,它可以与 PhaseBefore 一起按预期工作。但这似乎不一致。这些方法将阶段置于其他阶段,但不为合并执行排序。这是怎么做到的?
insertPhaseAfter
[Phase('Setup'), Phase('Monitoring'), Phase('Features'), Phase('Limit'), Phase('Call'), Phase('Fallback')]
[Phase('Setup'), Phase('Monitoring'), Phase('Features'), Phase('Auth'), Phase('Call'), Phase('Fallback')]
insertPhaseBefore
[Phase('Setup'), Phase('Monitoring'), Phase('Auth'), Phase('Features'), Phase('Call'), Phase('Fallback')]
[Phase('Setup'), Phase('Monitoring'), Phase('Limit'), Phase('Features'), Phase('Call'), Phase('Fallback')]
- 我想删除阶段拦截器。
rate(100) {
route("/sub") {
rate(5) {
get("/critical") {
call.respondText("Hello, World!")
}
}
get("/profile/{id}") { TODO("...") }
}
}
所以对于 /sub/critical 来说,只有带有 Rate(5) 的拦截器应该被调用,而 Rate(100) 应该被跳过。这在当前架构中可能吗?我认为没有办法覆盖合并并删除阶段“限制”的“最后一个”拦截器。对于所有没有“限制”的管道,另一个“限制”应该保持不变。其他拦截器(如 Auth)应照常执行。
【问题讨论】:
-
你有没有想过这个问题? :) 我现在也坚持第 2 部分
-
@Josttie 不。 1st 的 github 问题从未得到解决(只是移到了他们的内部跟踪器),然后我什至没有理会 #2。 Imo ktor 似乎更像是一个概念证明框架。不会将它用于任何有成效的事情。但是,如果您发现它,请随时回答。祝你好运