DEV Community πŸ‘©β€πŸ’»πŸ‘¨β€πŸ’»

DEV Community πŸ‘©β€πŸ’»πŸ‘¨β€πŸ’» is a community of 966,904 amazing developers

We're a place where coders share, stay up-to-date and grow their careers.

Create account Log in
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)

Update Your DEV Experience Level:

Settings

Go to your customization settings to nudge your home feed to show content more relevant to your developer experience level. πŸ›