Exportando directamente un informe desde Report Services

12 08 2008

Buscando la manera de exportar directamente un informe en Report Services 2005, desde código (evitando su visualización), me encuentro con la página de Fran Diaz que hace un tutorial de como implementarlo desde un WinFom haciendo uso del WebService del SQL Server Reporting Services 2005.

Requeria implementarlo desde una WebForm, y he aquí que me encuentro con una serie de detalles para hacerlo funcionar correctamente. Tengo un Servidor de Informes y un servidor de paginas web, ambas en maquinas diferentes.

El primer error fue implementar los permisos, necesitaba autentificarme correctamente, para eso tuve que crear/modificar –de alguna parte lo habré sacado, solo que no recuerdo de que página, si el autor aparece, favor de notificarmelo, para los créditos correspondientes–, como decía, hubo que implementar una clase para este fin (ReportServerCredentials) para resolver este problemilla.

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Reporting.WebForms;
using System.Security.Principal;
using System.Net;
using System.Collections;
using System.Collections.Generic;

namespace UtileriasReportServices
{
    /// <summary>
    /// Local implementation of IReportServerCredentials
    /// </summary>
    public class ReportServerCredentials : IReportServerCredentials
    {
        private string _userName;
        private string _password;
        private string _domain;

        public ReportServerCredentials(string userName, string password, string domain)
        {
            _userName = userName;
            _password = password;
            _domain = domain;
        }

        public WindowsIdentity ImpersonationUser
        {
            get
            {
                // Use default identity.
                return null;
            }
        }

        public ICredentials NetworkCredentials
        {
            get
            {
                // Use default identity.
                return new NetworkCredential(_userName, _password, _domain);
            }
        }

        public bool GetFormsCredentials(out Cookie authCookie, out string user, out string password, out string authority)
        {
            // Do not use forms credentials to authenticate.
            authCookie = null;
            user = password = authority = null;
            return false;
        }
    }
}

Con lo segundo que me topé, fue con los parámetros, me dio flojera implementarlo directamente como un arreglo de ParameterValue para el Report Services, así que como ya tenia el arreglo de parámetros solo lo convertí al array adecuado para la ocasión.

Y el último obstaculo era el error del identificador de sesión

Server Error in ‘/Nombre_Aplicacion’ Application.
——————————————————————————–

Falta el identificador de la sesión. Es necesario un identificador de sesión para esta operación. —> Falta el identificador de la sesión. Es necesario un identificador de sesión para esta operación.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Web.Services.Protocols.SoapException: Falta el identificador de la sesión. Es necesario un identificador de sesión para esta operación. —> Falta el identificador de la sesión. Es necesario un identificador de sesión para esta operación.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Buscando me encontré con que primero se hace un LoadReport del  reporte y despues se establecen los parámetros, oops! un pequeño detalle pasado por alto.

Al final, para la exportacion quedó como sigue:

protected void BExportReport_Click(object sender, EventArgs e)
    {
        parametros.Clear();

        //agregar parametros
        parametros.Add(new ReportParameter("Param1", "valor"));

        // variable que contendrá el formato.
        string formato = "CSV"; //exportar a csv
        string history = null;

        // Creo una instancia del Servicio web de ejecución.
        RSExecution.ReportExecutionService RSG = new RSExecution.ReportExecutionService();
        // Asigno las credenciales.
        RSGuardar.Credentials = new ReportServerCredentials(
                                                            WebConfiguration.GetKeyFromWebConfig("UserId"),
                                                            WebConfiguration.GetKeyFromWebConfig("PwdId"),
                                                            WebConfiguration.GetKeyFromWebConfig("Server")).NetworkCredentials;

        RSExecution.ExecutionInfo execInfo = new RSExecution.ExecutionInfo();
        RSExecution.ExecutionHeader execHeader = new RSExecution.ExecutionHeader();

        RSG.ExecutionHeaderValue = execHeader;

        execInfo = RSGuardar.LoadReport(reporte, history);
        // Convertimos los parámetros
        RSExecutionSiniestros.ParameterValue[] parametrosrs = ConvertirReportParameterToParameterValue(parametros);
        RSG.SetExecutionParameters(parametrosrs, "es-mx");

        string deviceInfo = String.Empty;
        string Extension = formato;
        Byte[] Resultados = null;
        string Codificacion = String.Empty;
        string mimeType = String.Empty;
        RSExecutionSiniestros.Warning[] warnings = null;
        string[] streamsIDs = null;

        // Paso los resultados de renderizar a un conjunto de bytes.
        Resultados = RSG.Render(formato, deviceInfo, out Extension, out Codificacion, out mimeType, out warnings, out streamsIDs);
        // Escribo el conjunto de bytes en un archivo con su extensión.
        Response.ContentType = "application/octet-stream";
        Response.AppendHeader("Content-Disposition", "attachment;filename=" + "Nombre_Archivo.csv");
        Response.OutputStream.Write(Resultados, 0, Resultados.Length);
        Response.End();
    }

Aqui encontrarán mas información en el blog de Scott de como implementar la exportacion, y que junto con la página de Fran Diaz, me ayudo a completar la tarea.

1Saludo


Acciones

Information

13 responses

7 05 2009
Hola

Hola, tu página me ha ayudado de mucho, pero tengo un problema con los parametros , de donde sacaste RSExecutionSiniestros, que es?

Gracias y saludos.

7 05 2009
esquinadotnet

Es el nombre de la instacia del WebService del servidor de Reporting Services.

Recomiendo que visites la página de Fran Diaz (http://geeks.ms/blogs/fdiaz/archive/2006/10/17/Exportando-un-informe-desde-Reporting-Services.aspx) para ahondar sobre el tema.

7 05 2009
Hola

Hola, disculpa, oye y como es esta funcion ConvertirReportParameterToParameterValue() de la linea 27.
Ojala puedas contestarme, es que ya llevo mucho tiempo tratando de exportar a PDF y mi unico problema ahorita es mandarle el parametro.

Gracias.

7 05 2009
esquinadotnet

Solo Convierte una lista de ReportParameter a ParameterValue para la llamada al WebService.

algo asi como

private Nombre_de_la_instancia_de_WebService.ParameterValue[] ConvertirReportParameterToParameterValue(List repParam)
{
Nombre_de_la_instancia_de_WebService.ParameterValue[] paramValue = new Nombre_de_la_instancia_de_WebService.ParameterValue[repParam.Count];
for (int i = 0; i < repParam.Count; i++)
{
paramValue[i] = new Nombre_de_la_instancia_de_WebService.ParameterValue();
paramValue[i].Name = repParam[i].Name;
paramValue[i].Value = repParam[i].Values[0];
}
return paramValue;
}

Saludos.

7 07 2009
Gabriel SM

Hola, tengo un problema no cuando cargo la referencia al webservices no me trae los mismos metodos entre ellos el mas importante rs.Loadreport() me marca error : Server did not recognize the value of HTTP Header SOAPAction: http://schemas.microsoft.com/sqlserver/2005/06/30/reporting/reportingservices/LoadReport. podrias ayudarme, a que se debe?
Saludos.

8 07 2009
9 07 2009
Gabriel SM

Ya lo he solucionado el problema radicaba en la forma en que llamaba el webservices. estaba llamando otro que no trae los metodos del Execution services. Gracias.

13 07 2009
juan camilo

Ho la que tal, tengo un problema ,tengo reporting services instalado en otra maquina en una red local, pero no logro acceder al WebService del servidor de Reporting Services(reporting services si funciona porque puedo ver los reportes con el reportviewer, es un proyecto en asp.net) es como si no existiera, mi pregunta es si este servicio hay que crearlo o hay que instalar algo aparte del reporting services? Agradezco de antemano cualquier ayuda.

22 12 2009
Kbits

como saber si el reporte tiene datos, o mejor dicho la consulta para el reporte devuelgo algo asi no muestro el ssrs solo con los encabezados

15 05 2012
CARLOS ALFONSO FABREGAS MERINO

Buen día, alguien me puede ayudar con un error que tengo al generar un archivo .csv con reporting? me salen los datos bien pero al final me genera todo el código html de la página, porque pasa eso?

22 05 2012
Blogger

No se como lo estes haciendo, si via codigo o directamente, asi que te paso esta liga, espero que te sea de utilidad. http://blogs.infosupport.com/modify-reporting-services-export-to-csv-behavior/

28 01 2014
Juan Carlos

como agrego un nombre al archivo que genera?

10 02 2014
Blogger

leete todo el post y hay un enlace al blog de Fran Diaz para que le eches un vistazo.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s




A %d blogueros les gusta esto: