生成由动作过滤器控制的PDF?

时间:2015-04-07 10:46:41

标签: c# asp.net asp.net-web-api owin

当客户端在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
    }
}
  1. 有没有办法阻止调用OnActionExecuted,例如什么时候没有参数?print
  2. 根据请求返回文件流(PDF)或JSON数据是否可以接受(客户应该如何知道?)
  3. 使用动作过滤器执行此操作是否可以,或者我应该更好地编写例如一个自定义的OWIN中间件?

1 个答案:

答案 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关于操作过滤器的引用:

  

动作过滤器,它包装动作方法执行。这个过滤器   可以执行其他处理,例如向其提供额外数据   动作方法,检查返回值或取消执行   行动方法。

使用中间件时,您将松开某种代码耦合,使代码更易于阅读和维护。 但这取决于你的团队惯例和围绕这段代码的所有业务逻辑。