DEV Community

Iulio Cesar
Iulio Cesar

Posted on • Updated on

SQL Server Reporting Services en .Net Core

Net Core no cuenta con soporte oficial para SQL Server Reporting Services (SSRS), sin embargo se puede utilizar un web service la cual permite generar y exportar sus reportes.

La URL a consumir cuenta con un formato similar al siguiente, donde es la instancia de tu servidor de SSRS.

https:///ReportServer/ReportExecution2005.asmx?wsdl

Visual studio permite importar y generar códigos en base a un webservice existente, se pude realizar siguiendo los siguientes pasos en un proyecto de net core en visual studio.

  1. Click derecho en la sección "Dependencias" y seleccionar la opción "Agregar servicio conecado".
    Untitled

  2. Seleccionar la opción "Microsoft WCF Web Service Reference Provider".
    Untitled 1

  3. Llenar el wizard que aparecera en pantalla con la URL del webservice y el namespace en el cual se desea generar el codigo.
    Untitled 2

El siguiente fragmento de código es un pequeño ejemplo para poder comenzar a utilizar el webservice desde una aplicación de net core.

private ReportExecutionServiceSoapClient GetProxy()
{
    var proxy = new ReportExecutionServiceSoapClient(GetBinding(), GetEndpointAddress());
    proxy.ClientCredentials.Windows.ClientCredential = new NetworkCredential(config.ReportUserName, config.ReportPassword, config.ReportUserNameDominio);

    return proxy;
}

private HttpBindingBase GetBinding(bool isHttps)
{
    HttpBindingBase result = null;

    if (isHttps)
    {
        result = new BasicHttpsBinding() 
        { 
            Security = { 
                Mode = BasicHttpsSecurityMode.Transport 
            }
        };
    }
    else
    {
        result = new BasicHttpBinding() 
        {
            Security = { 
                Mode = BasicHttpSecurityMode.TransportCredentialOnly,
                Transport = { 
                                    ClientCredentialType = HttpClientCredentialType.Ntlm, 
                  ProxyCredentialType = HttpProxyCredentialType.None
                }
            }
        };
    }

    result.MaxReceivedMessageSize = int.MaxValue;
    result.MaxBufferSize = int.MaxValue;

    return result;
}

public async Task<object> ExportReport(string reportPath, string reportName, Dictionary<string, string> parameters)
{
    try
    {
        var proxy = GetProxy();
        var rsParameters = parameters.Select(it => new ParameterValue() { Name = it.Key, Value = it.Value }).ToArray();
        var trustedUserHeader = new TrustedUserHeader();

        var loadResponse = await proxy.LoadReportAsync(trustedUserHeader, $"{reportPath}{reportName}", null);
        var executionHeader = new ExecutionHeader()
        { 
            ExecutionID = loadResponse.executionInfo.ExecutionID
        };

        await proxy.SetExecutionParametersAsync(executionHeader, trustedUserHeader, rsParameters, "");

        var request = new RenderRequest(executionHeader,
            trustedUserHeader,
            exportType.ToString(),
            new XElement("DeviceInfo", new XElement("OutputFormat", "PDF")).ToString()
        );

        var response = await proxy.RenderAsync(request);

        await proxy.CloseAsync();

        return new 
        {
            Bytes = response.Result,
            Encoding = response.Encoding,
            FileNameExtension = response.Extension,
            MimeType = response.MimeType,
            Streams = response.StreamIds,
            Warnings = response.Warnings?.Select(it => it.Message).ToArray()
        };
    }
    catch (Exception ex)
    {
        string message = ex.GetBaseException().Message;
        throw ex;
    }
}
Enter fullscreen mode Exit fullscreen mode

Ahora con la función "ExportReport" se podra exportar cualquier reporte de SSRS como PDF, por ejemplo

var report = await ExportReport("intancia/misReportes", 
    "Empleados",
    new Dictionary<string, string>() { {"Departamento", "IT"} }
);
Enter fullscreen mode Exit fullscreen mode

Para mas información respecto a este tema, se pueden consultar los siguientes enlaces:

Report Server Web Service Endpoints - SQL Server Reporting Services (SSRS)

Top comments (0)