Accueil Nos publications Blog Telerik Reporting, Silverlight and WCF Service

Telerik Reporting, Silverlight and WCF Service

Pour des applications d’entreprise il est nécessaire de prévoir une solution de reporting pour vos utilisateurs ! Chez So@t, notre système d’information utilise les contrôles Telerik, nous avons donc voulu tester Telerik Reporting.

Telerik Reporting fourni un ReportViewer très bien fait compatible avec Silverlight, WPF, ASP.Net, Azure et Windows Forms qui supporte l’impression ainsi que l’extraction des données vers différents supports : Excel, PDF, etc.

On trouve très peu d’articles (ou des morceaux d’étapes) sur sa mise en place ainsi que des retours d’utilisation avec Silverlight et un web service WCF, ce que nous allons voir de A à Z dans cet article.

SOMMAIRE

1. Côté Serveur

1.1 Création du web service WCF de reports avec IIS
1.2 Utilisation du web service WCF de reports en Windows Service
1.3 Création un report Telerik avec des paramètres visibles côté Silverlight

2. Côté Client

2.1 Ajout du web service côté Silverlight et récupération de la liste des reports disponibles côté server
2.2 Génération d’un report avec paramètre envoyé côté Silverlight
2.3 Configuration du service côté Silverlight pour éviter les Timeout (cas d’un report long à générer)
2.4 Custom du design du report

Lien vers la documentation de Telerik Reporting : https://www.telerik.com/help/reporting/overview.html

1. Côté Serveur

1.1 Création du web service WCF de reports avec IIS

Ajoutez les *.dll suivantes à votre projet web :

  • System.ServiceModel.dll assembly
  • Telerik.Reporting.Service.dll assembly

Ajoutez à votre projet web, un nouveau WCF service que vous appellerez “ReportService.svc” :

Supprimez les fichiers créés automatiquement ReportService.cs et IReportService.cs puis ouvrez le fichier ReportService.svc pour remplacer l’existant par la ligne suivante :

</pre>
<p>Vérifiez que lu numéro de version ci-dessus correspond bien au numéro de version de votre fichier Relerik.Reporting.Service.dll  précédemment ajouté.</p>
<p>Modifiez votre fichier de configuration Web.config pour y ajouter dans la section Service.Model les lignes suivantes :</p>
<pre><code class="language-cs">
<system.serviceModel>
<service name="Telerik.Reporting.Service.ReportService" behaviorConfiguration="ReportServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="https://localhost:8001/ReportService.svc"/>
</baseAddresses>
</host>
<endpoint address="" binding="basicHttpBinding" contract="Telerik.Reporting.Service.IReportService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="ReportService/resources" binding="webHttpBinding" behaviorConfiguration="WebBehavior" contract="Telerik.Reporting.Service.IResourceService"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="WebBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="ReportServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>

Attention, il faut mettre l’aspnetcompatibility à true pour que votre service fonctionne ! Vous pouvez maintenant ajouter dans le même projet vos Reports Telerik.

1.2 Utilisation du web service WCF de reports en Windows Service

Créez une classe ReportService implémentant l’interface ReportServiceBase de Telerik :


public class ReportService : ReportServiceBase
{
protected override Uri BaseAddress
{
get
{
return new Uri("https://localhost/myservice/CustomReportService.svc", UriKind.RelativeOrAbsolute);
}
}
}

Modifiez le fichier App.config de l’application console pour ajouter le service comme ci-dessous :


<service name="mynamespace. ReportService" behaviorConfiguration="ReportServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="https://localhost/myservice/ReportService.svc" />
</baseAddresses>
</host>
<endpoint address="" binding="basicHttpBinding" contract="Telerik.Reporting.Service.IReportService">
</endpoint>
<endpoint address="resources" binding="webHttpBinding" behaviorConfiguration="WebBehavior" contract="Telerik.Reporting.Service.IResourceService"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>

Le namespace “mynamespace. ReportService” étant celui de votre classe précédemment créée. Ajoutez les behaviors suivant dans la section </behaviors> de votre fichier App.config :


<serviceBehaviors>
<behavior name="ReportServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
<behavior name="WebBehavior">
<webHttp />
</behavior>
</serviceBehaviors>

Le service peut aussi fonctionner en customBinding. Attention, si vous utiliser votre service en basicHttpBinding, il faut ajouter le fameux fichier ClientAccessPolicy.xml, voici un très bon article qui explique comment faire lorsque vous utilisez un service Windows : https://www.dotnetcurry.com/ShowArticle.aspx?ID=208

Attention, les reports doivent être dans votre application console si vous utilisez la méthode GetAllAvailableReports  (cf. image ci-contre) :

1.3 Création du report Telerik avec des paramètres visibles côté Silverlight

Créez un nouveau report Telerik, à la création de votre report, le Wizard de création se lance automatiquement :

Sélectionnez votre source de données qui peut être selon les types ci-dessus, puis sélectionnez les champs que vous souhaitez afficher dans votre Report.

Ajoutez si besoin des paramètres à votre Report, pour que ces paramètres soient directement modifiables côté Silverlight, dans les propriétés du paramètre, mettre à true la propriété IsVisible :

Vous pouvez lancer le mode preview pour voir si votre Report fonctionne, si c’est le cas vous pouvez passer à l’étape suivante, côté Client.

2. Côté Client

2.1 Ajout du web service côté Silverlight et récupération de la liste des reports disponibles côté server

Pour ajouter votre web service, clic droit sur votre projet Silverlight, puis “Add Service Reference”:

La méthode GetListAvailableReports vous fournira la liste des Reports disponibles côté serveur (dans le même projet qui lance votre service ReportService.svc), vous pourrez ainsi afficher la liste des Reports disponibles à vos utilisateurs.

Une fois un report sélectionné par un utilisateur, on souhaite maintenant l’afficher, pour cela on utilise le contrôle ReportViewer de Telerik.

Insérez ainsi dans votre vue *.xaml qui affichera votre Report, le code suivant :


<telerik:ReportViewer x:Name="ReportViewer"
ReportServerUri="https://localhost:8001/SoatUnderground.ServicesHost/DAF/ReportService.svc"
Report="{Binding CurrentReport.Value}"/>

La propriété ReportServerUri étant l’URL de votre ReportService.svc, la propriété Report est la propriété FullName d’un report de votre liste fournie par la méthode vue GetListAvailableReports précédemment.

2.2 Génération d’un report avec paramètre envoyé côté Silverlight

Afin d’envoyer un paramètre au Report, il faut utiliser la méthode RenderBegin. Pour cela, allez dans le code behind de votre vue *.xaml qui contient le ReportViewer, puis ajoutez les lignes de code suivantes :


public ReportsView()
{
InitializeComponent();
ReportViewer.RenderBegin += new Telerik.ReportViewer.Silverlight.RenderBeginEventHandler(ReportViewer_RenderBegin);
}

void ReportViewer_RenderBegin(object sender, Telerik.ReportViewer.Silverlight.RenderBeginEventArgs args)
{
args.ParameterValues["CurrentUserLogin"] = CurrentUserLogin;
}

Utilisez bien le même nom de paramètre que celui défini dans votre report côté serveur.

2.3 Configuration du service côté Silverlight pour éviter les Timeout (cas d’un report long à générer)

Si certains de vos Reports sont long à générer, vous avez du remarquer que le ReportViewer affiche un message d’erreur de timeout. Il faut donc modifier le temps du timeout ce qui ne fonctionne en modifiant dans le fichier de configuration côté client, les bindings définis ne sont pas pris en compte.

La solution est donc de créer un custom binding spécifique lors de l’appel du service pour générer un nouveau report ainsi d’utiliser l’API  IReportServiceClientFactory de Telerik :


public partial class ReportsView : UserControl, IReportServiceClientFactory, IReportsView
{
#region Constructor
/// <summary>
/// Constructeur par défaut
/// </summary>
public ReportsView()
{
InitializeComponent();
ReportViewer.ReportServiceClientFactory = this;
ReportViewer.RenderBegin += new Telerik.ReportViewer.Silverlight.RenderBeginEventHandler(ReportViewer_RenderBegin);
}
#endregion

public ReportServiceClient Create(Uri remoteAddress)
{
BasicHttpBinding binding = new BasicHttpBinding();

//
// Increase the max message size in order to avoid the dreaded message:
// System.ServiceModel.CommunicationException : The maximum message size quota for incoming
// messages (65536) has been exceeded. To increase the quota, use the MaxReceivedMessageSize
// property on the appropriate binding element.
//
binding.MaxReceivedMessageSize = Int32.MaxValue;

//
// Now set the timeout to an appropriate number of seconds.
// TODO:  Handle the timeout exception gracefully if it does happen, i.e., set the timeout to 30 minutes.
//
binding.SendTimeout = new System.TimeSpan(0, 30, 0);

return new ReportServiceClient(binding, new EndpointAddress(remoteAddress));

}
}

Dans la méthode Create(Uri remoteAddress) qui sera appelé à chaque demande d’une nouvelle génération, la propriété Uri remoteAddress  est celle définie ci-dessus dans le fichier *.xaml par la propriété ReportServerUri.

2.4 Custom du design du report

Voici le résultat en image :

Le ReportViewer fait bien apparaître les paramètres (dont la propriété IsVisible a été mise à true côté Serveur), vous pouvez ainsi modifier ces paramètres et cliquer sur « Preview » afin de régénérer un report.

Le style du ReportViewer est également modifiable si vous le souhaitez.

Conclusion

Une fois ces différentes étapes réalisées, vous n’aurez plus qu’à rajouter au fur et à mesure vos reports dans votre projet web ou bien dans votre application console. Le ReportService.svc détectera automatiquement les nouveaux reports qui seront ainsi proposés à l’utilisateur. L’export Excel de votre Report ne prendra que quelques secondes à votre utilisateur ! Telerik Reporting est donc adapté pour une utilisation dans le cadre d’applications d’entreprise.