当客户端在Web API路由的查询字符串中传递某个参数(?print
)时,我需要生成某些数据集的PDF报告。现在我想知道自定义动作过滤器是否适合这样做。
public class ReportFilterAttribute : ActionFilterAttribute {
public ReportFilterAttribute(string controller, string layoutPath) {
}
public override void OnActionExecuting(HttpActionContext actionContext)
{
// look for parameter ?print in the request query string
}
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
// load layout file
// fill in data returned by the api
// manipulate response to return a filestream instead of json data
}
}
OnActionExecuted
,例如什么时候没有参数?print
?答案 0 :(得分:0)
实现这一目标的良好做法是创建自定义http handler / owin中间件。 最好在不同类型的响应中使用不同的处理程序/中间件,而不是在代码中的某处使用“隐藏逻辑”。
您有一个WebApi默认返回JSON数据,但在某些情况下它会返回一个PDF文件。对我来说这听起来很奇怪。 使用http处理程序,您将没有描述某些模糊逻辑的注释,如:
// look for parameter ?print in the request query string
// manipulate response to return a filestream instead of json data
这两个组件的名称描述了自己。 HttpHandler听起来会处理某种请求,另一方面,ActionFilter会将请求过滤到具体的操作。
以下是MSDN关于操作过滤器的引用:
动作过滤器,它包装动作方法执行。这个过滤器 可以执行其他处理,例如向其提供额外数据 动作方法,检查返回值或取消执行 行动方法。
使用中间件时,您将松开某种代码耦合,使代码更易于阅读和维护。 但这取决于你的团队惯例和围绕这段代码的所有业务逻辑。