【问题标题】:Generate PDF controlled by action filters?生成由动作过滤器控制的 PDF?
【发布时间】:2015-04-07 10:46:40
【问题描述】:

当客户端在 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 中间件?

【问题讨论】:

  • 除了在动作过滤器中检查print参数是否存在,我认为你不能在WebApiConfig.cs中这样做(即:仅在@987654327时注册动作过滤器@ 参数在那里)。至于文件流,我想说,只要您返回正确的内容标头,客户端就应该知道并做出相应的反应 - stackoverflow.com/questions/9541351/…

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


【解决方案1】:

实现这一点的好习惯是创建一个自定义的http handler/owin 中间件。 最好为不同类型的响应使用不同的处理程序/中间件,而不是代码中某处的“隐藏逻辑”。

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

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

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

这是 MSDN 关于操作过滤器的引述:

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

此外,使用中间件,您将失去某种代码耦合,并使您的代码更易于阅读和维护。 但这在很大程度上取决于您的团队约定以及围绕该代码段的所有业务逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 2015-06-12
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    相关资源
    最近更新 更多