Representación de informes .rdlc con ASP .NET Core

¿Es posible generar .rdlcinformes con ASP.NET Core? Actualmente, esto solo parece ser posible si me dirijo a .NET Framework en lugar de .NET Core.

No necesito un visor de informes, solo necesito representar los resultados de un .rdlcinforme como una matriz de bytes.

Answer

Si desea crear pdf/excel/word usando el informe rdlc, le recomiendo que use la biblioteca AspNetCore.Reporting. Esto es de código abierto y viene como un paquete nuget. puede integrar esto en su función .NET Core API o .NET Core Azure. Puede generar una matriz de bytes, convertirla a una cadena base 64 y recuperarla en su lado del cliente. Más en el enlace en el comentario.

Muy bien puede convertir rdlc en una matriz de bytes. Consulte una pregunta relacionada que hice hace un tiempo. Visor de informes locales RDLC para ASP.NET Core y Angular(>2.0) .

Finalmente, una discusión creativa sobre ese hilo resultó en un paquete angular ( https://www.npmjs.com/package/ng2-pdfjs-viewer - Divulgación; soy el autor) con funcionalidad de matriz de bytes rdlc consumible en el lado del cliente. Por supuesto, en lugar de este paquete, puede elegir otra biblioteca de JavaScript para mostrar la matriz de bytes.

Un uso simple en angular sería así. Tenga en cuenta que la mayor parte del código se puede reutilizar incluso si está utilizando js simple u otro marco.

El siguiente código demuestra

1. Escupir matriz de bytes usando el control del visor de informes RDLC en el método de acción central de aspnet (en el lado del servidor) y enviarlo por cable usando http. (El código está en C#)
2. Procesamiento de la matriz de bytes de la respuesta en un objeto blob (Js)
3 . Introducir objeto blob en ng2-pdfjs-viewer.
4 . ng2-pdfjs-viewer utiliza internamente PDFJS de Mozilla para lograr la hazaña de mostrar el PDF en el navegador.
(Para su información... Tomé el código de las muestras proporcionadas en el paquete ng2-pdfjs-viewer. Reemplace los pasos 3 y 4 si está usando otra biblioteca o javascript simple)

<!-- your.component.html -->
<button (click)="showPdf();">Show</button>
<div style="width: 800px; height: 400px">
  <ng2-pdfjs-viewer #pdfViewer></ng2-pdfjs-viewer>
</div>

export class MyComponent implements OnInit {
  @ViewChild('pdfViewer') pdfViewer
  ...

  private downloadFile(url: string): any {
    return this.http.get(url, { responseType: ResponseContentType.Blob }).map(
      (res) => {
        return new Blob([res.blob()], { type: "application/pdf" });
      });
  }

  public showPdf() {
    let url = "http://localhost/api/GetMyPdf";
    this.downloadFile(url).subscribe(
    (res) => {
        this.pdfViewer.pdfSrc = res; // <---- pdfSrc can be Blob or Uint8Array
        this.pdfViewer.refresh(); // Ask pdf viewer to load/reresh pdf
      }
    );
  }

[HttpGet]
[Route("MyReport")]
public IActionResult GetReport()
{
   var reportViewer = new ReportViewer {ProcessingMode = ProcessingMode.Local};
   reportViewer.LocalReport.ReportPath = "Reports/MyReport.rdlc";

   reportViewer.LocalReport.DataSources.Add(new ReportDataSource("NameOfDataSource1", reportObjectList1));
   reportViewer.LocalReport.DataSources.Add(new ReportDataSource("NameOfDataSource2", reportObjectList1));

   Warning[] warnings;
   string[] streamids;
   string mimeType;
   string encoding;
   string extension;

   var bytes = reportViewer.LocalReport.Render("application/pdf", null, out mimeType, out encoding, out extension, out streamids, out warnings);

   return File(bytes, "application/pdf")
}

No puede representar informes .rdlc en .NET Core, utilizando .rdlc como una matriz de bytes.

La representación de informes RDLC se basa en WinForms y WebForms y actualmente solo se admite en .NET Framework. Con suerte, Microsoft pondrá a disposición una versión (reducida) (solo mostrando los informes para empezar) en .NET Core o .NET 5, pero aún no se sabe nada.

Como alternativa, puede optar por una solución en la que ejecute la representación de informes como una aplicación ASP.NET 2 separada que tiene como destino .NET Framework, mientras que el resto de su aplicación podría tener como destino .NET Core 3 o posterior. De esa manera, puede llamar a los puntos finales de informes con los datos apropiados y devolverá un informe representado.

Esto es lo que hice: crear una especie de arquitectura de microservicios en la que varias aplicaciones .Net Core 3.1 pueden publicar tanto la definición del informe XML RDLC como los datos en un punto final que se ejecuta en net48, que utiliza la LocalReportclase para representar el informe en el formato deseado. devolviéndolo como una matriz de bytes.

Angular app |  ---->  |  APIs (.Net Core 3.1)  |  ---->  |  API (.Net Framework 4.8)