首页 > 解决方案 > 如何设置 jsreport MVC 作为网络服务器而不是实用程序运行?

问题描述

我想在网络服务器模式下使用 jsreport,而不是在 ASP.NET MVC 中使用实用程序模式。实用程序模式是使用命令行参数和服务器模式将二进制文件作为 Web 服务器启动并使用 http 协议与其通信。

这在 jsreport.net 上显示,但没有用于 MVC 中的 CustomFilter 版本的示例。

var rs = new LocalReporting().UseBinary(JsReportBinary.GetBinary()).AsWebServer().Create();
await rs.StartAsync();
var report = await rs.RenderAsync(...);
await rs.KillAsync();

所以我想用它作为 MVC 中的 CustomFilter 解决方案。

标签: c#.netasp.net-mvcserverjsreport

解决方案


第一步是重写RegisterGlobalFilters方法以使用jsreport作为webserver:

public static ILocalWebServerReportingService RegisterGlobalFilters(GlobalFilterCollection filters)
{
  filters.Add(new HandleErrorAttribute()); 

  var rs = new LocalReporting()
    .Configure(cfg =>
    {
      cfg.BaseUrlAsWorkingDirectory();
      return cfg;
    })
    .UseBinary(JsReportBinary.GetBinary())
    .AsWebServer()
    .Create();

  rs.StartAsync().GetAwaiter().GetResult();

  filters.Add(new JsReportFilterAttribute(rs));

  return rs;
}

然后我们需要使用引用的报告服务在 Global.asax 中的应用程序端停止:

public class MvcApplication : System.Web.HttpApplication
{
  private ILocalWebServerReportingService reportingService;

  protected void Application_Start()
  {
    ...
    reportingService = FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    ...
  }

  protected void Application_End()
  {
    reportingService.KillAsync().GetAwaiter().GetResult();
  }
}

推荐阅读