Affichage des articles dont le libellé est Silverlight. Afficher tous les articles
Affichage des articles dont le libellé est Silverlight. Afficher tous les articles

Silverlight et Log4Net

La thématique de l'outil de traces est ancienne comme le monde des développeurs. Il faut toujours pouvoir tracer son programme et retirer ces traces au moment du déploiement.

Alors parmi tous les outils de traces mon regard se tourne vers Log4Net et puis-je l'utiliser avec Silverlight ?

Un bon tutoriel mais en anglais ici.

La page la plus intéressante sur ce sujet pour moi, se trouve ici. On y apprend que l'on ne pourra pas utiliser directement Log4Net avec Silverlight car aucune des builds n'est réalisée avec ce framework : Log4Net Supported Frameworks.

Qu'il est inutile de tenter de compiler les sources de Log4Net avec Silverlight, étant donné les restrictions de ce dernier, il n'est pas possible d'avoir accès au système de fichiers côté client et donc de créer un fichier de logs.

On y donne également le début d'une solution : Utiliser l'application ASP.NET qui host le .xap de Silverlight pour faire une référence à la DLL log4net. Vous n'avez plus qu'à développer un service web qui permettra à Silverlight d'utiliser Log4Net.

Voici donc le projet :
Une Business application for Silverlight 5.0
Une Asp.net application qui host le .xap et qui aura une référence sur la dll log4net.
Un WCF Service dans l'application asp.net que l'on va rendre utilisable depuis Silverlight.
Le tout pour faire des Logs dans un fichier texte.

Silverlight Business Application for Log4Net

Je créé une application Business pour Silverlight que je nomme BusinessApplicationLog4Net :

Silverlight Business Application BusinessApplicationLog4Net
Je créé une référence à la DLL log4Net que j'ai installée :


Référence à log4net dans mon projet BusinessApplicationLog4Net

ASP.NET Business Application and Log4Net afficher des traces

Installation d'un bouton et d'un TextBox dans l'application asp.net afin de faire des logs.

Dans la Silverlight Business Application, derrière la page BusinessApplicationLog4NetTestPage.aspx il n'y a pas de code behind, je souhaite pourtant faire des logs à partir d'un bouton de cette page. Je une nouevelle page BusinessApplicationLog4NetTestPage.aspx cette fois avec son code behing et je copie le cope nécessaire l'embarquement du .xap. Je peux ainsi ajouter mon bouton et déclencher du code derrière :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Collections;

// Here is the once-per-application setup information
[assembly: log4net.Config.XmlConfigurator(Watch = true)]

namespace BusinessApplicationLog4Net.Web
{
    public partial class BusinessApplicationLog4NetTestPage : System.Web.UI.Page
    {
        // Should be declared for each class
        private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        protected void Page_Load(object sender, EventArgs e)
        {
            log.Debug("Page Loaded");
        }

        private static int nbLogs = 0;

        protected void ButtonMakeLog_Click(object sender, EventArgs e)
        {
            log.Debug("ButtonMakeLog_Click");
            TextBoxLog.Text = "nbLog " + nbLogs.ToString();
            log.Debug(TextBoxLog.Text);
            nbLogs++;
        }
    }
}

Pour faire des logs il me faut encore trois choses :
le déclenchement d'une fonction d'assembly XmlConfigurator
la déclaration d'une variable log
l'appel à la fonction log que je fais depuis la page Page_Load

ASP.NET and Log4Net web.config

Remarque importante :
Je me suis égaré en lisant le tutoriel dans la création d'un fichier de configuration pour Log4Net à part : Log4Net.config mais cela ne fonctionnait pas.
Il faut avoir à l'esprit les limitations des applications asp.net qui sont sécurisées et mon application ne trouvait jamais le fichier Log4Net.config je pris donc le parti de configurer mon Log4Net dans le fichier Web.config

Pour les logs, je créé un répertoire Log auxquels je donne accès à "Tout le monde".
Et je lance mon application :

Silverlight Business Application for Log4Net
Et maintenant pour afficher mes logs, je tape l'url suivante :

http://localhost:52878/Log/log.txt

Et les logs s'affichent dans mon navigateur :

ASP.NET Business Application afficher les logs

WCF Service for Service references in RIA application

Pour que mon application Silverlight puisse elle aussi faire des logs avec Log4Net, je créé un WCF Service hosté par mon application ASP.NET que je nomme ServiceLogger :

WCF Service Logger
Je ne fais pas le détail du code, vous pourrez télécharger ce code source en bas de cet article.

Pour utiliser ce service dans mon application Siverlight il faut lui ajouter une Service Refrence :
Silverlight Application Add Service Reference
En suite je clique sur "Discover" pour découvrir les Services installés au sein de ma solution :


Pour découvrir les fonctionnalités de mon service, je clique sur ServiceLogger.svc et là je tombe sur l'erreur :

WCF Service Hosted by ASP.NET application - Error while attempting to find services
La solution détaillée de cette erreur se trouve Ici.

Une fois les lignes :

using System.ServiceModel.Activation;

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]

Ajoutées dans mon services, et :
Remarque importante : La création de WCF Services comme bien d'autres objets entraîne du code généré afin de le mettre à jour ne pas hésiter à "Cleaner" la solution.

J'obtiens enfin mon ServiceReference que je nomme "ServiceLogger" :

Silverlight WCF Ria Services 

Silverlight make logs using Service References

Je rajoute un bouton et un textbox dans la page home de mon application Silverlight. 
Le code de mon bouton est le suivant :

        private int nbLogs = 0;

        private void buttonMakeLog_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            var log = new ServiceLogger.ServiceLoggerClient();
            log.LogMessageAsync("Click on button will produced log on server" + nbLogs.ToString());

            textBox.Text = "log " + nbLogs.ToString();
            nbLogs++;
        }

Je l'exécute et je joue un peu avec :

Silverlight utilise un Service Reference et Log4Net pour afficher des traces
Et j'affiche mes traces :

Grâce à Log4Net mon application Silverlight fait des traces dans ASP.NET

Conclusion

Oui c'est délicat de mettre en oeuvre l'ensemble de ces technologies surtout avec Silverlight et ASP.NET. Au début du projet, on ne peut pas être certain d'aboutir puis on trouve des astuces des contournements. En développant il faut bien garder à l'esprit les différentes limitations des applications Silverlight et ASP.NET en général c'est cela qui permet de trouver une solution.

Download Source Code

Requirements :
Visual Studio 2010
Silverlight 5.0
Log4Net

Download Source Code





Silverlight et Reporting Services (2/2)

Vous êtes peut-être comme moi, resté sur votre fin lors de l'exploration de l'exemple d'Ernesto Herrera sur les Silverlight et Reporting Services. Alors allons plus loin dans le détail des explications du fonctionnement de cette application.

Rappel sur les applications Silverlight et ASP.NET

C'est l'application Web ASP.NET qui Host l'application Silverlight grâce à la page :
ReportingServicesDemoTestPage.aspx
et la ligne :
<param name="source" value="ClientBin/ReportingServicesDemo.xap"/>

Ainsi lorsque vous exécutez l'application dans un navigateur, l'url qui s'affiche est :
http://localhost:52878/ReportingServicesDemoTestPage.aspx#/Home

Et vous obtenez le résultat d'exécution de l'application Silverlight dans la page web Host,
de la façon suivante :

Exécution de l'application Silverlight et Reporting Services dans Chrome
Nous avons configuré "Reporting Services" dans la page de notre application Web ASP.NET : RpDemoWebForm.aspx, ainsi lorsque l'on clique sur un "Sales Order ID" par exemple le "71774", une fenêtre popup s'affiche pour montrer le détail d'un ordre de vente dans un rapport "Reporting Service". Cette fois il s'agit d'une simple page web qui affiche le rapport et l'on obtient le résultat de l'exécution suivant :

Silverlight et les Reporting Services  - Détails d'une vente

Silverlight WCF RIA Services - RIA Control Navigation Page

Comment tout ceci fonctionne t-il ? Attardons nous sur la navigation page Silverlight qui affiche la Grid et découvrons cette page. Ernesto Herrera dit qu'il a simplement ajouter une DataGrid dans la page Home du projet : ReportingServicesDemo\Views\Home.xaml

En fait il fait bien plus que cela :

Page Home Silverlight qui utilise le DomainDataSource pour afficher les données dans une DataGrid
Il a donc ajouté à la page également un riaControls:DomainDataSource.

Cette page Silverlight possède une petite icône de BD dans la colonne de gauche.

Il y a deux balises remarquables "riaControls:DomainDataSource" et "my:ADWLTDomainContext" ce sont ces deux balises qui donnent le résultat de la petite icône BD dans la colonne gauche.

En sélectionnant la balise "ADWLTDomainContext" j'obtiens le résultat graphique suivant :

ADWLTDomainContext - DomainDataSource du Services RIA WCF
L'icône de BD est sélectionnée.

Ajout de riaControls dans la page Silverlight

A fin d'ajouter le riaControls vers le DomainContext vous devez ajouter dans la page Home.xaml les deux XML Name Space :

  xmlns:riaControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.DomainServices" 
  xmlns:domain="clr-namespace:ReportingServicesDemo.Web"

Dans le projet, ajoutez une référence à : System.Windows.Controls.DomainServices

Pour cela vous devez avoir installé le  SDK : RIA Services
Vérification de l'installation du SDK dans :
C:\Program Files\Microsoft SDKs\RIA Services\v1.0\

Et sinon vous pouvez l'installer Ici.

En suite toujours dans la page Home.xaml, on ajoute le code :

                <riaControls:DomainDataSource 
                    AutoLoad="True" 
                    d:DesignData="{d:DesignInstance domain:SalesOrderHeader, CreateList=true}" 
                    Height="0" 
                    LoadedData="salesOrderHeaderDomainDataSource_LoadedData" 
                    Name="salesOrderHeaderDomainDataSource" 
                    QueryName="GetSalesOrderHeaderQuery" 
                    Width="0">
                    <riaControls:DomainDataSource.DomainContext>
                        <domain:ADWLTDomainContext />
                    </riaControls:DomainDataSource.DomainContext>
                </riaControls:DomainDataSource>

A la compilation une erreur :

Error 1
The tag 'ADWLTDomainContext' does not exist in XML namespace 'clr-namespace:ReportingServicesDemo.Web'.

Cette erreur semble nous indiquer que le domain services n'a pas été créé dans ReportingServicesDemo.Web. En effet dans l'application de référence on peut constater l'existence de deux fichiers :

Création du WCF RIA Services

Création de la DataSource du DomainContext

Il s'agit d'une erreur ou bien d'un problème de version mais dans le projet 
d'Ernesto Herrera les deux fichiers :

ADWLTDomainService.cs
ADWLTDomainService.metadata.cs

Sont dans le répertoire racine, tandis que si on les déplace dans le répertoire Services et que l'on fait :

Visual Studio - Show Data Sources
Un répertoire \\ReportingServicesDemo\ReportingServicesDemo\Properties\DataSources est créé il contient le fichier : ReportingServicesDemo.Web.ADWLTDomainContext.datasource généré automatiquement.

Et pourtant mon application ne fonctionne toujours pas !

Silverlight WCF RIA Services Error NotFound !
C'est un piège dans lequel on tombe parfois avec Visual Studio et tout le code généré automatiquement mais les fichiers .datasource ne sont pas le problème. Dans ce cas je préconise de recommencer l'application à zéro.

Je créé une Business Application Silverlight 5.0
J'importe la base AdventureWorksLT2008_Data.mdf dans App_Data
Je recommence mon Modèle Entity, je n'inclus que les tables
Pour changer un peu je vais me passer de la Class Orders.cs et j'attaque directement SalesOrderDetail ma Query Link s'écrit donc :

        public IQueryable<SalesOrderDetail> GetOrderDetails(int OrderID)
        {
            AdventureWorksLT2008_DataEntities adw = new AdventureWorksLT2008_DataEntities();

            var query = from c in adw.SalesOrderDetail.Include("Product")
                        where c.SalesOrderID == OrderID
                        select new SalesOrderDetail
                        {
                            //SalesOrderID = OrderID,
                            //SalesOrderDetailID = c.SalesOrderDetailID,
                            //ProducName = c.Product.Name, // BRY 
                            //OrderQty = c.OrderQty,
                            UnitPrice = c.UnitPrice //,
                            //UnitPriceDiscount = c.UnitPriceDiscount,
                            //LineTotal = c.LineTotal
                        };

            return query;
        }

Et l'application tombe en marche mais lorsque je clique sur le bouton me permettant de voir les détails d'un ordre :

Reporting Services - Error to LINQ Entity

Le DomainContext est généré automatiquement dans :
BusinessApplicationReportingServices\BusinessApplicationReportingServices
\Generated_Code\BusinessApplicationReportingServices.Web.g.cs

Alors je réécris ma query linq, le plus simplement du monde :

        public IQueryable<SalesOrderDetail> GetMyOrderDetails(int OrderID)
        {
            AdventureWorksLT2008_DataEntities adw = new AdventureWorksLT2008_DataEntities();

            var query = from c in adw.SalesOrderDetail//.Include("Product")
                        where c.SalesOrderID == OrderID
                        select c;
            return query;
        }

Et le tout tombe en marche :

Silverlight - Reporting Services

Conclusion

DomaineServices, Reporting Services et Silverlight cela parait tout simple mais les pièges sont nombreux notamment à cause de tout ce code généré il faut souvent rebuilder, mettre à jour les schémas parfois cleaner  pour que la solution fonctionne finalement.

Finalement :
Je réintègre la class Orders.cs pour effectuer la jointure je réécris le Report Services pour obtenir le résultat suivant :

Exécution de l'application Silverlight WCF RIA - Reporting Services

Exécution de l'application Silverlight WCF RIA - Reporting Services - Détails d'un ordre de vente

Download Source Code

Requirements :
Visual Studio 2010 SP1
Reporting Services
WCF Ria Services for Silverlight 5.0
SQL Server EXPRESS 2008








Silverlight et Reporting Services (1/2)

Voilà un sujet qu'il est très intéressant, laissons de côté le choix de Crystal Report ou de Reporting Services avec une page de lecture Ici.

Alors comment réaliser une intégration rapide avec une couche présentation Silverlight, un accès aux données Entity Framework et des Reporting Services aux milieu de tout cela.

Je base mon exploration sur l'exemple du site CodeProject :
http://www.codeproject.com/Articles/97452/Integrate-Reporting-Services-with-Silverlight-and
Integrate Reporting Services with Silverlight and RIA Services

Dans le Projet ReportingServicesDemo.Web le répertoire App_Data est vide !
Mais où est la BD ? C'est toujours le même problème avec SQL Server les .mdf ne sont jamais livrés et vous trouvez cela normal ?

J'ouvre le fichier Web.config pour inspecter la partie "connectionStrings" du projet et là je peux lire :
Data Source=WSCORSIS032\SQLSERVER08;Initial Catalog=AdventureWorksLT2008;

Cela ne risque pas de fonctionner sur votre plateforme de développement.

Trouver la BD AdventureWorksLT2008

Initial Catalog me dit qu'il faut chercher une BD avec un nom du genre AdventureWorksLT2008 ...
On la trouve facilement dans le CodePlex :

SQL Server BD AdventureWorksLT2008
C'est sûr le projet de Ernesto Herrera ne fait que 801 Ko tandis qu'à lui seul le fichier AdventureWorksLT2008_Data.mdf fait 8 512 Ko, CQFD.

J'utilise une version Express de SQL Server 2008 cela va-t-il fonctionner ?

Le projet Reporting Services with Silverlight

En gros, je vais essayer de : 
  • importer la BD AdventureWorksLT2008_Data dans le répertoire App_Data du projet
  • modifier le fichier Web.config pour que la connectionStrings soit correcte
  • effectuer une mise à jour du Modèle d'Entities

Import de AdventureWorksLT2008_Data  dans le projet

Une fois le .zip téléchargé et dézippé. Dans mon projet ReportingServicesDemo.Web, je fais un "Add->Existing Item..." je pointe sur AdventureWorksLT2008_Data.mdf et j'importe dans le répertoire prévu à cet effet : App_Data. Me voilà avec la BD importée dans mon projet :

Import de AdventureWorksLT2008 dans l'App_Data du projet ReportingServicesDemo.Web

Mise à jour de l'ADO.NET Entity Data Model

Dans Visual Studio j'ouvre le fichier ADWLTModel.edmx (Entity Data Model). Je vais tenter une mise à jour du modèle depuis la BD :

ADWLTModel.edmx mise à jour depuis la BD
Donc bouton droit-> Update Model from Database ... :

ADWLTModel Mise à jour depuis la BD AdventureWorksLT2008
Quelle jolie boite de dialogues ! Je peux y voir déjà que Visual Studio aura repéré la BD que j'ai importé sur mon disque dur mais pas encore celle de mon projet.

Visual Studio me propose dans de mettre à jour la ConnexionString de mon fichier Web.config.

Mais soyons fou et modifiions cette chose là !

Je clique sur "New Connection..." :

Entity Data Model - New Connection ...
Avec le bouton "Browse..." je vais pointer sur la BD que je viens d'importer dans mon projet :
\\ReportingServicesDemo\ReportingServicesDemo.Web\App_Data\AdventureWorksLT2008_Data.mdf

Je me retrouve avec une nouvelle chaîne de connexion :

ADWLTModel Mise à jour depuis la BD AdventureWorksLT2008 nouvelle chaîne de connexion
Pour les amateurs d'application Web ASP.NET, vous avouerez que cette nouvelle chaîne de connexion est bien plus souhaitable au passage elle est bien plus portable.

On note le changement de SQL Server de SQL Server 2008 à SQLEXPRESS ...
On note également l'utilisation du |DataDirectory| ce qui est classique pour une application ASP.NET.

Je clique sur "Next..." :

Entity Data Model - Mise à jour depuis la BD importée dans App_Data
Puis sur "Finish" ... 

Grossière erreur, je viens d'ajouter les tables aux tables déjà existantes dans mon Modèle Entities (.edmx). Dans Visual Studio c'est la panique un rebuild du projet ReportingServicesDemo.Web me sort une séries d'erreurs incontrôlables.

Je passe par "Delete" "Refresh" bref ... :


Au bout d'un moment je sélectionne tous les objets du fichier ADWLTModel.edmx puis les supprime, sauvegarde le modèle qui est maintenant vide, je fais à nouveau un Add des Tables des Views et des Procédures stockées depuis ma base de données et le projet fonctionne :

Silverlight et Reporting Services - Exécution du projet après mise à jour du Modèle Entities
Le projet d'Ernesto Herrera : Integrate Reporting Services with Silverlight and RIA Services fonctionne maintenant sur ma plateforme de développement et, de plus il est portable ...

Conclusion

Ce n'est pas si facile lorsque l'on est confronté pour la première fois à ce genre de chose. Par la suite et par la pratique, on prend de bonnes habitudes. On cesse de paniquer devant des erreurs incontrôlables et l'on reprend les choses simplement de façon propre.

L'idée c'est que ce qui est généré automatiquement doit être mise à jour automatiquement. Vous auriez pu par exemple mettre à jour la connexionString dans le Web.config manuellement cela aurait été une erreur de mon point de vu.

Si Ernesto Herrera avait utilisé le répertoire App_Data sont projet aurait été nettement plus portable car il aurait suffit d'importer AdventureWorksLT2008_Data.mdf dans ce répertoire pour que son projet fonctionne.

Download Sample
Requirements :
Visual Studio 2010
Silverlight v5.0
Reporting Services

Pour aller plus loin 

HappyNet Silverlight Prism MVVM - Processus d'authentification

Comment permettre à un utilisateur de s'authentifier dans le projet HappyNet ?

HappyNet Connexion et Authentification
Entrons directement dans le vif du sujet, la partie UI est présente dans :
\\HappyNet-SL5\Client\Module\
Soat.HappyNet.Silverlight.Modules.Main\Views\LoginState\LoginStateView.xaml
<Button x:Name="LoginButton"
   cal:Click.Command="{Binding LoginCommand}"

Si l'on tape sur "Enter" le processus d'authentification démarre grâce au trigger :

                        <i:Interaction.Triggers>
                            <triggers:KeyTrigger Key="Enter">
                                <action:ExecuteCommandAction Command="{Binding LoginCommand}" />
                            </triggers:KeyTrigger>
                        </i:Interaction.Triggers>

Code de LoginCommand :
\\HappyNet-SL5\Client\Module\Soat.HappyNet.Silverlight.Modules.Main\Views\LoginState\ILoginStateViewModel.cs
\\HappyNet-SL5\Client\Module\Soat.HappyNet.Silverlight.Modules.Main\Views\LoginState\LoginStateViewModel.cs

public void InitializeCommands()
{
     this.LoginCommand = new DelegateCommand(this.OnLogin,
                () => !string.IsNullOrEmpty(this.UserName) && !string.IsNullOrEmpty(this.Password));

public void OnLogin()
{
            IsLoading = true;
            mainService.BeginLogin(this.UserName, this.Password, LoginCompleted);
}

\\HappyNet-SL5\Client\Module\Soat.HappyNet.Silverlight.Modules.Main\Services\MainService.cs

public void BeginLogin(string user, string password, ServiceCompleted<User> LoginCompleted)
{
            client.LoginAsync(user, password,
                new ServiceArgs<User>(LoginCompleted));
}

Autrement dit, on ne voit absolument pas dans quelle BD ni dans quelle table ni quel champ on utilise pour authentifier un utilisateur ... c'est de la magie encore une fois.

Authentification avec Silverlight et AdventureWorks

J'ai continué de chercher comment s'authentifier avec HappyNet et je suis tombé sur la page suivante :

On y voit d'ailleurs que l'on fait un "Add Exiting Item" de la Data Base AdventureWorks dans le répertoire App_Data ce qui est à mon sens une bonne chose pour le déploiement de l'application ...

Un problème avec Entity Framework et Available Context Class, la solution est Ici.





AdventureWorks for HappyNet v1.2

Le projet HappyNet possède un écueil de taille ; la BD AdventureWorks n'est pas installée et du coup il ne fonctionne pas !

On trouvera dans la documentation que l'on peut trouver une version de la BD Ici.

HappyNet v1.2 où est la base de donnée ?

HappyNet utilise Entity Framework pour fournir un modèle de la base AdventureWorks ce modèle est utilisé ensuite par les services WCF Services de la partie Silverlight.

Ce modèle entity se touve dans :
\\HappyNet v1.2 - SL5
\HappyNet-SL5
\Server\Core\Soat.HappyNet.Server.Entities\EntitiesModel.edmx

Mais que faire pour mettre en oeuvre la BD ?

Je parcours le projet et trouve dans le fichier :
\\HappyNet v1.2 - SL5\HappyNet-SL5\
Server\Core\Soat.HappyNet.Server.Entities\App.Config

Je trouve une ConnectionString :

 <!-- /!\ INSTALL NOTE /!\ Fill in the correct configuration to access your database -->
<add name="AdventureWorks2008" connectionString="Database=AdventureWorks_Data;Server=MyServer;Integrated Security=True;User ID=Username;Password=Password" providerName="System.Data.SqlClient" />

Cela ne risque pas de fonctionner !

Remarques : 

Je trouve le découpage du projet un peu curieux ...
Quelque chose de plus classique aurait été de mettre la BD dans le répertoire App_Data :
\HappyNet-SL5\Web\Soat.HappyNet.WebSite\App_Data\AdventureWorks_Data.mdf

Et donc le modèle entity dans Soat.HappyNet.WebSite qui est l'application Web qui hoste le .xap.

Autre remarque au niveau découpage du projet, le code behind des services comme par exemple :
HappyNet-SL5\Web\Soat.HappyNet.WebSite\Services\HumanResourcesService.svc
Se trouve dans :
\HappyNet-SL5\Server\Service\Soat.HappyNet.Server.Services.HumanResources\ServiceLayer\HumanResourcesService.cs

Dans HappyNet on trouve dans le projet Soat.HappyNet.Server.Entities
\HappyNet-SL5\Server\Core\Soat.HappyNet.Server.Entities\App.Config

<add name="AdventureWorksModel" connectionString="metadata=res://*/EntitiesModel.csdl|res://*/EntitiesModel.ssdl|res://*/EntitiesModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=TRAININGSQL;Initial Catalog=AdventureWorks2008;Persist Security Info=True;User ID=Silverlight;Password=pouetpouet!;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

Cela ne risque pas de fonctionner sur votre machine de développement !

Trouver la bonne chaîne de connexion

Astuce pour trouver la bonne chaîne de connexion :
Sur le projet :
\HappyNet v1.2 - SL5\HappyNet-SL5\Server\Core\Soat.HappyNet.Server.Entities
Je fais :
Add->NewItem->ADO Entity Data Model->que je nomme AdventureWorks
Et je regarde regarde la chaîne de connexion générée, je trouve:

<add name="AdventureWorksModel" connectionString="metadata=res://*/EntitiesModel.csdl|res://*/EntitiesModel.ssdl|res://*/EntitiesModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.\SQLEXPRESS;attachdbfilename=|DataDirectory|\AdventureWorks_Data.mdf;integrated security=True;connect timeout=30;user instance=True;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

Cela me parait être mieux.

Malgré tout à l'exécution j'aurais toujours un "Acces Denied" !

Autres tentatives

J'ai essayé de générer la BD à partir du Modèle Entity, cela ne fonctionne pas non plus ... Il manque alors certaines procédures stockées ...
Je ne trouve pas le moyen d'exécuter la procédure de création d'un utilisateur ...
Lorsque je tente de me connecter j'obtients l'erreur suivante :

{ExceptionDetail, probablement créé par IncludeExceptionDetailInFaults=true, dont la valeur est :

System.Data.EntityException: The underlying provider failed on Open. 
----> System.Data.SqlClient.SqlException: Unable to open the physical file 
"HappyNet-SL5\Web\Soat.HappyNet.WebSite\App_Data\AdventureWorks_Data.mdf". 
Operating system error 5: "5(Accès refusé.)".

An attempt to attach an auto-named database for file 
\\HappyNet-SL5\Web\Soat.HappyNet.WebSite\App_Data\AdventureWorks_Data.mdf failed. 
A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.

Sympathique comme erreur est ce que cela vient du répertoire où j'ai positionné la BD ?
Si j'essaye de la mettre dans :
\HappyNet-SL5\Server\Core\Soat.HappyNet.Server.Entities
Etant donné que d'autres projets font référence à celui-ci la BD est copiée autant de fois dans Bin et Debug et mon disque stature rapidement ...

J'arrête de perdre mon temps ...

Accès à la démonstration en ligne

A l'adresse suivante :

En cliquant sur le bouton "Ressources Humaines", on obtient le message "Access Denied" c'est rassurant :

HappyNet : Acces Denied
Vous avez certainement lu quelque part que l'on peut s'identifier avec demo/demo et ça fonctionne en effet :

HappyNet : Accès aux Ressources Humaines
Exécution dans chrome, accès à la partie Boutique :

HappyNet : Accès à la Boutique
Ca fonctionne ! Et Silverlight v5.0 est bien compatible avec Chrome.

Comment créer et authentifier un utilisateur ...

Conclusions

Oui c'est souvent le cas des projets Open Sources du Codeplex et surtout si vous avez derrière une société à but non lucratif, la Base de Donnée est très difficile à installer à configurée et souvent la "vraie" bd du projet n'est pas accessible facilement . Il faudra certainement faire appelle à leurs services moyennant quelques finances mais après tout c'est le jeux ...

Vous aurez remarqué au passage l'extrême lenteur d'exécution de ce type d'application, si vous avez une machine un peu ancienne, elle sera à genoux !

Je suis surpris de l'exécution dans le navigateur Chrome mais c'est une très bonne surprise. Après la disparition de Flash aucune nouvelles plateformes ne voulant plus installer son plug-in, on peut penser que les applications Silverlight ont encore un peu d'avenir.