Nella prima parte del blog abbiamo costruito un report attraverso il SQL Server Business Intelligence Development Studio di SQL Server 2008 R2 e lo abbiamo fatto puntare ad un istanza del nostro database SQL Azure. Poi lo abbiamo pubblicato su una nostra istanza dei SQL Azure Reporting Service e attraverso il portale di gestione dei report abbiamo visualizzato il risultato finale. E’ evidente che l’utilizzo del portale non è adatto alla costruzione delle applicazioni ma che nella maggior parte dei casi embedderemo i report all’interno della nostra soluzione web.

In questo blog vedremo come costruire una soluzione web da pubblicare su Windows Azure che hosti il report attraverso il controllo Report Viewer. Il processo non è per nulla complicato ma ci sono alcuni punti da seguire con attenzione per poter avere il risultato che ci aspettiamo.

La prima cosa da fare è creare un nuovo progetto con Visual Studio 2010 selezionando come tipo di templace Cloud e come tipo di progetto Windows Azure Project. Poi è necessario selezionare ASP.NET Web Role e lasciare che Visual Studio costruisca la soluzione fatta e finita e pronta per essere pubblicata su una sottoscrizione Azure.

Aprite la pagina Default.aspx e trascinate dalla toolbox il controllo ReportViewer

image

Non impostate nessuna proprietà perchè lo faremo direttamente dal codice della pagina. Nel Page_Init della pagina inserite il seguente codice:

protected void Page_Init(object sender, EventArgs e)
{
           
            ReportViewer1.ServerReport.ReportServerUrl =
                new Uri(String.Format("https://{0}/reportserver","vostroserver.ctp.reporting.database.windows.net"));
            ReportViewer1.ServerReport.ReportPath = "/percorso/nomedelreport";

            ReportViewer1.ServerReport.ReportServerCredentials = new ReportServerCredentials("utente", "password", "vostroserver");

}

La prima riga di codice imposta il parametro ReportServerUrl del controllo per farlo puntare alla vostra istanza server su dei Reporting Services su Azure. Il secondo parametrò è il percorso completo per arrivare al report che avete pubblicato sul report server. La terza riga di codice crea un istanza di una classe (che vedremo tra poco) per impostare le credenziali di accesso al report server. Questa operazione è necessaria per permettere al controllo di accedere ai report pubblicati.

Per fare in modo che tutto funzioni correttamente dobbiamo creare la classe ReportServerCredendials che deve implemtare l’interfaccia IReportServerCredentials che il report viewer si aspetta. Qui sotto trovare il codice della classe:

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

namespace WebRole1
{
    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)
        {
            authCookie = null;
            user = _userName;
            password = _password;
            authority = _domain;
            return true;
        }

    }
}

Facciamo build e siamo pronti per pubblicare la nostra applicazione su Windows Azure. Prima però dobbiamo fare altri due passi fondamentali (che oggi non sono ancora automatici) e che se non fatti impediscono di fatto il deployment della soluzione. La prima cosa da fare è aggiungere alle referenze del progetto la liberaria Microsoft.ReportViewer.Common (la Microsoft.ReportViewer.WebForms è stata già aggiunta da Visual Studio)

image

La seconda cosa da fare è impostare per entrambe le librerie la proprietà Copy Local a True:

image

Adesso siamo pronti per pubblicare la nostra applicazione su Windows Azure (attraverso Visual Studio o tramite il portale windows.azure.com)

Una volta pubblicata il risultato dovrebbe essere più o meno quello che vedete qui sotto:

image

Il nostro incubo continuerà per ancora tanto tempo però almeno non dobbiamo installare i report in casa del cliente Smile