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

Generate PDF controlled by action filters?

当客户端在 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. 根据请求,return 文件流 (PDF) 或 JSON 数据是否是一种可接受的做法(客户应该如何知道这一点?)
  3. 是否可以使用动作过滤器执行此操作,或者我应该更好地编写例如自定义 OWIN 中间件?

实现此目的的良好做法是创建自定义 http handler/owin 中间件。 最好为不同类型的响应设置不同的 handlers/middlewares,而不是在代码中的某处设置 "hidden logic"。

您有一个 WebApi,默认情况下 returns 一个 JSON 数据,但在某些情况下它 returns 一个 PDF 文件。对我来说这听起来很奇怪。 使用 http 处理程序,您将不会有描述一些模糊逻辑的注释,例如:

// look for parameter ?print in the request query string
// manipulate response to return a filestream instead of json data

这两个组件的名称描述了它们自己。 HttpHandler 听起来像是会处理某种请求,另一方面,ActionFilter 听起来像是将请求过滤为具体操作。

这里引用了 MSDN 中关于动作过滤器的一段话:

Action filter, which wraps the action method execution. This filter can perform additional processing, such as providing extra data to the action method, inspecting the return value, or canceling execution of the action method.

还有一个中间件,你会失去某种代码耦合,让你的代码更容易阅读和维护。 但这在很大程度上取决于您的团队约定以及围绕该段代码的所有业务逻辑。