Windows 8.1 et Virtual PC sous Windows XP

Avec l'arrivée de Windows 8 et de Windows 8.1 que devient Virtual PC ? Est-il possible d'installer une machine virtuelle avec Windows 8.1 ? Je ne trouve pas d'informations réellement probantes sur ce sujet.

Quelques lectures Ici ou  mais on y parle que d'Oracle Virtual Box.

Alors on va faire l'essai. J'ai installé Virtual PC :

Virtual PC for Windows XP SP3
Je télécharge une image ISO de Windows 8.1 :

Téléchargement de Windows 8.1 Entreprise Preview
Vous devez posséder un compte Windows Live afin de répondre à quelques questions avant de pouvoir télécharger le fichier : 9431.0.WINMAIN_BLUEMP.130615-1214_X86FRE_ENTERPRISE_FR-FR_VL-IMP_CENA_X86FREV_FR-FR_DV5.ISO

Grâce à Virtual PC, je créé un nouvel ordinateur virtuel et je vais lui faire avaler cette image iso comme disque de boot. Je démarre ce nouvel ordinateur virtuel :

Virtual PC Ordinateur Virtuel pour Windows 8.1
Dans le menu "CD" je fais capturer une image ISO et je tape sur "Return".
Ce nouvel ordinateur virtuel est capable de booter sur l'image iso j'obtiens un joli poisson qui fait des bulles :

Windows 8.1, le joli poisson qui fait des bulles dans Virtual PC
Mais au bout de quelques secondes :

Virtual PC : Une erreur interne s'est produite sur l'ordinateur virtuel. L'ordinateur virtuel va se réinitialiser

J'ai beau cliquer sur le bouton "Réinitialiser" rien n'y fait la même erreur se produit à chaque fois. J'aurais quand même eu le plaisir de voir le "joli poisson qui fait des bulles".

Conclusion

Virtual PC 2007 installé dans sur une machine hôte Windows XP ne peut pas installer d'ordinateur virtuel avec une image iso de Windows 8.1. Entreprise Preview. Cette image iso ne semble pas faite pour lui, je vais essayer avec Oracle Virtual Box mais la même erreur se produit.

Error Code : 0x0000005D
Pour résoudre ce problème, suivez les directives du fabricant pour permettre à NX ("bit no execute"), ou le XD équivalent ("Execute Disabled"), la fonction dans les réglages du BIOS.

La suite des explications Ici et des explications détaillées .
Error Code: 0x0000005D
Parameters:
0x030F0204
0x756E6547
0x49656E69
0x6C65746E

Mon processeur est incompatible avec Windows 8 !

Vous souhaitez en savoir plus sur les caractéristiques de votre CPU et le mode de compatibilité avec Windows 8, c'est Ici.

Have fun! It's only software.

Ajout en 2020

C'est ça qui est incroyable avec Internet c'est que l'on peut relire d'ancienne chose et découvrir à quel point elles sont encore valables aujourd'hui les incompatibilités entre les différentes version de Windows c'est une chose mais aujourd'hui c'est Oracle Virtual Machine qui me pose un gros problème !

En effet je suis avec une configuration stable depuis quelques années je n'aime pas me jeter sur le dernier OS qui sort sauf pour essayer avant d'y passer trouver les astuces qui permettent d'aller plus vite d'être plus à l'aise de mieux bosser.

Mais là je souhaite relancer une machine virtuelle qui doit avoir trois quatre ans et qui tournait très bien avec Oracle Virtual Machine mais au moment de l'exécuter :

Beug !

C'est scandaleux, vous imaginez mon désarrois. J'utilise exprès Oracle Virtual Machine pour m'affranchir des problèmes de compatibilité et OVM est  devenu incompatible avec mes machines, je suis ... j'ai pas de mot je ne pensais pas qu'ils oseraient.

C'est à ça qu'on reconnait les Cons, ils osent tout !

WCF Services - WCF Test Client - Problème

Je cherche à créer une application console qui hébergerait un WCF Service, parce que pour le développement il serait plus facile d'héberger mon service ainsi que de devoir à l'installer ailleurs.

Contexte du problème 

Je pars de l'exemple de Jason De Olivera :
http://www.jasondeoliveira.com/2009/07/tutorial-adonet-data-services-part-3.html
qui me semble parfait pour ce que je souhaite faire : une WCF Application Service et deux Consoles une pour le Client et une pour le Host :

WCF Service hosté dans une application console - Projet Visual Studio 2010
Je lance l'exécution du client :

WCF Service hosté dans un application console - Exécution
J'exécute la commande "EF" pour lire des données à partir du Modèle Entity Framework :

WCF Service lecture des données à partir du Modèle Entity d'Entity Framework
Mon service est en cours d'exécution, grâce aux ligne de code c# suivantes :
\030 - Tutorial ADO.NET Data Services\ADODataServiceLearning_Part4\Host\Program.cs
const string sURI = "http://localhost:37052/ExampleDataService.svc";
host = new DataServiceHost(typeof(ExampleDataService), new Uri[] { baseAddress });
host.Open();

Je pense légitimement que je vais pouvoir utiliser WCF Test Service pour tester le service, je lance donc un "Add Service..." :

Utilisation de WCF Test Service pour tester mon service hosté dans la console
Mais j'obtiens l'erreur suivante :

Erreur à la découverte de mon WCF Service hosté
En gros elle me dit :
Error: Cannot obtain Metadata from http://localhost:37052/ExampleDataService.svc
If this is a Windows (R) Communication Foundation service to which you have access, 
please check that you have enabled metadata publishing at the specified address.  
For help enabling metadata publishing, please refer to the MSDN documentation at 
http://go.microsoft.com/fwlink/?LinkId=65455.
WS-Metadata Exchange Error    URI: http://localhost:37052/ExampleDataService.svc    
Metadata contains a reference that cannot be resolved: 'http://localhost:37052/ExampleDataService.svc'.    
The remote server returned an unexpected response: (405) Method Not Allowed.    
The remote server returned an error: (405) Method Not Allowed.
HTTP GET Error    URI: http://localhost:37052/ExampleDataService.svc    
The document at the url http://localhost:37052/ExampleDataService.svc/ 
was not recognized as a known document type.
The error message from each known type may help you fix the problem:
- Report from 'XML Schema' is 'The root element of a W3C XML Schema should be <schema> 
  and its namespace should be 'http://www.w3.org/2001/XMLSchema'.'.
- Report from 'DISCO Document' is 'Discovery document at the URL 
  http://localhost:37052/ExampleDataService.svc/ could not be found.'.  
- The document format is not recognized.
- Report from 'WSDL Document' is 'There is an error in XML document (2, 2).'.  
- <service xmlns='http://www.w3.org/2007/app'> was not expected.

Solution au problème de WCF Test Client

Il faut utiliser l'outil Service Configuration Editor pour configurer le WCF Service : ExampleDataService.svc et créer le contenu des fichiers .config manquant dans la solution. Cette configuration des WCF Services doit être effectuée dans le ficher App.config de la Console qui hoste le service.

WCF Services - AspNetCompatibilityRequirements - Problème

Un petit souci que j'aimerais soulever. Il y a de nombreuse manipulations à effectuer pour créer véritablement une architecture de logiciel correctement fondée sur les WCF Services.

Contexte du problème 

J'ai une application qui utilise le modèle suivant :
J'ai créé un WCF Service :
  DataService.svc

Que je dérive d'une interface :

IDataService.cs

    [ServiceContract]
    public interface IDataService
    {
        [OperationContract]
        Data_Customer GetCustomer(int ID);
    }
    [DataContract]
    public class Data_Customer
    {
        [DataMember]
        public int CustomerID { get; set; }
        [DataMember]
        public string FirstName { get; set; }
        [DataMember]
        public string LastName { get; set; }
    }

Mon application fonctionne et puis je décide d'y ajouter un WCF Data Service :

WPF Using WCF Services
Mais à l'exécution de mon application, j'obtiens l'erreur suivante au moment d'appeler le service  :
WCF Service Error while addind WCF Data Service in solution
Voilà que maintenant, je suis amené à rajouter les lignes suivantes dans mon service pour qu'il fonctionne à nouveau :

    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together.
    using System.ServiceModel.Activation;
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
    public class Service1 : IService1
    {

C'est un peu déroutant ...

Si l'on essaye de mettre à jour le Service Référence :

WCF Services - Mise à jour du Service Référence
On tombe sur une erreur d'un autre monde :

WCF Service Reference Updated
To Be Continued

C# .NET Frameworks - DevForce for Silverlight

DevForce est un framework qui permet de construire et d'exploiter des données dans une application riche d'entreprise. DevForce fournit les outils, les techniques et les bibliothèques dont vous avez besoin pour créer des applications business puissantes et rapides.

http://www.ideablade.com/solutions/solutions.aspx

DevForce Processus d'installation

Vous devez vous enregistrer pour obtenir une clef produit. 


Je vais installer la version 2010.
DevForce-2010.setup.6.1.14.exe

Je clique sur l'exécutable :

DevForce 2010 Install
Je rentre ma clef produit, elle m'a été fournit par email lors de mon enregistrement et je modifie la lettre de disque car j'installe dans E:\ :
DevForce 2010 Install et Clef Produit
Erreur pendant le processus d'installation de DevForce 2010 :
DevForce 2010 - Erreur pendant l'installation

DevForce 2010 - Debugger l'erreur d'installation
Je décide donc de désinstaller le produit pour tenter de le réinstaller dans C:\ par curiosité :

Erreur pendant l'installation de DevForce 2010 désinstallation du produit
Erreur pendant l'installation de DevForce 2010 - désinstallation du produit
Mais la même erreur se produit !

Tan pis, je continue le processus d'installation, l'erreur est curieuse et l'installation créé un répertoire :
C:\Program Files\DevForce 2010\TemplateBackups\ProjectTemplates\DevForce%202010

On notera le caractère "%" dans le nom de ce répertoire ...

A la fin de l'install mon navigateur s'ouvre à la page :
http://www.ideablade.com/getting-started/getting-started-universal.aspx

La lecture du "DevForce Installation Guide.pdf", fournit avec l'install, permettra peut-être de résoudre quelques soucis d'installation.

DevForce Getting Started

Ca commence ici

Started in Silverlight

DevForce in Silverlight

Et maintenant tentons de créer une application Silverligt basée sur DevForce.


Je lance Visual Studio 2010 et je fais File->New->Project :

DevForce in Silverlight création d'une Application Business
Remarque : j'ai ici bien plus de templates que dans la documentation de DevForce.

Il faut avoir installé le Silverlight SDK 4.0 ...

Et la création d'une application DevForce Silverlight Business vous demande de choisir entre Silverlight 4.0 et Silverlight 5.0 :

DevForce Silverlight target version

DevForce Entity Data Model

Au moment d'attacher la BD NorthwindIB dans Visual Studio une erreur :

DevForce Erreur de la BD NorthwindIB
La version de NorthwindIB utilisée par DevForce est 661 tandis que SQL Server 2008 Express Edition n'en est qu'à la version 655.

Un petit retour dans le DevForce Installation Guide pour constater que DevForce fournit une autre BD pour SQL Server 2005 et 2008, on note au passage un petit souci, le lien vers la BD est au choix :

http://www.ideablade.com/friends/NorthwindIB.zip
ou
ftp://www.ideablade.com/Code-Samples-SQL-Databases/NorthwindIB-for-SQL2005-2008.zip

Tout ceci n'est pas très sérieux !

Mais une fois la bonne version de Base de Données installée, on peut créer l'Entity Data Model :

DevForce Silverlight Application - Entity Data Model
Et l'on obtient bien le message :

DevForce création de l'Entity Data Model - Message de sécurité
Et l'ADO.NET Entity Data Model est créé correctement :

ADO.NET Entity Data Model for DevForce Data Base NorthwindIB
En complétant mon code en créant le ViewModel de la Main Page, j'obtiens le résultat d'exécution suivant :

DevForce Silverlight Business Application

Conclusion

DevForce dans cet exemple est utilisé comme surcouche de l'Entity Framework et simplifie l'écriture de l'application Silverlight et son accès aux données. Mais je ne vois pas encore comment DevForce peut m'aider à écrire des applications multiplate-forme ce qui est pourtant le but recherché.

Requirements :
DevForce 2010
SQL Server 2008 Express Edition
Visual Studio 2010
EntityFramework

Download  Source Code

Frameworks C#.NET Multiplateformes

Après ces différentes études des plateformes de développement C# et des différents frameworks correspondants, on se doute que certaines équipes de développement souhaiteraient capitaliser sur un framework qui facilite le développement et capitalise un socle commun pour décliner une série d'applications permettant le développement multiplateforme : postes, tablettes, phone.

Voici donc certains produits sur le net répondants à cette problématique ...

DevForce

Toujours là en 2023, on dirait une sorte de framework "multiplateformes"

https://www.ideablade.com/products/devforce-features
DevForce implements an end-to-end n-tier architecture. It works by exposing a generic web service on the server that takes a LINQ expression and returns business objects to the client over the internet.

https://www.ideablade.com/products/devforce-downloads

Vous devez enregistrer pour obtenir une clef produit.

Il est possible de travailler avec Visual Studio 2010 mais la dernière version est faite pour VS 2012.

En suite, on trouve trois éditions du produit : Universal, Silverlight et WinClient.

Mais aussi le produit Cocktail qui permet de développer des applications Silverlight et WPF et prend en charge les modèles de développement comme MVVM et les design patterns.

Je vais installer DevForce 2010 Universal v6.1.14

https://www.ideablade.com/about

Si vous avez produits dans ce genre merci de nous envoyer un message de contact dans le formulaire adéquat ;-)

Dissection des nouveautés de Silverlight 5

Si vous êtes utilisateur de Silverlight 4.0 et que vous manquez d'arguments pour passer à Silverlight 5.0 alors cet article de David Catuhe est pour vous :

http://msdn.microsoft.com/fr-fr/silverlight/hh184212
Énormément d'améliorations ont été apportées à cette dernière version de Silverlight. On doit remarquer que ces améliorations sont souvent issues de WPF. Ne devait-il pas y avoir convergence entre WPF et Silverlight ? Mais c'est une autre histoire ...

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 - Service References - Error while attempting to find services

Mais qu'elle est donc cette erreur !?

"An error occured while attempting to find services at 'http://localhost/ServiceLogger.svc'"

Contexte de l'erreur

Je cherche à faire des logs avec Log4Net depuis une application Silverlight. J'ai créé une "Business Application Silverlight" hostée par une application ASP.NET. Je développe mon service de Log dans BusinessApplicationLog4Net.Web et par l'intermédiaire d'un "Service Reference", je donnerai accès aux services de Log dans mon application Silverlight (ou du moins je l'espère) :

ASP.NET qui host un WCF Service pour une application Silverlight
Dans l'application Silverlight, je fais "Add Service Reference ..."

Siverlight hosted application - Add Service Reference
Mais au moment de découvrir les Services mis à disposition par l'application ASP.NET, avec Siverlight une erreur survient :

Siverlight - Add Servcice Reference ... - An error occured while attempting to find services
Comme je l'ai déjà indiqué et que lorsque l'on utilise les Services du code est généré il faut donc cleaner rebuilder mais rien n'y fait !

Solution ?

Dans le fichier ASP.NET Web.config :

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="false" 
                               multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

Je propose de mettre aspNetCompatibilityEnabled à false. Pourquoi ? Tout simplement parce que j'ai cherché et trouver cette préconisation, également en regardant le détail de cette erreur :

Silverlight - Service Reference - AspNetCompatibility Error
Cette fois mon Service est enfin découvert :

Siverlight - Add Servcice Reference ... - Mon service est enfin découvert
Tout de même cela me parait curieux, je devrais rendre mon Hosting Services Environment incompatible avec ASP.NET pour l'utiliser dans Siverlight ...

Je lance l'application :

Siverlight - aspNetCompatibilityEnabled à false
Quelle belle erreur ! Toutes ces applications demandent que l'utilisateur soit ou non authentifié et le service d'authentification de Silverlight dans ce cas ne reconnait plus mon utilisateur.

C'est perdu !

Conclusion

Et c'est bien dommage car en câblant un bouton sur la View Home de mon application Silverlight :

\\BusinessApplicationLog4Net\BusinessApplicationLog4Net\Views\Home.xaml.cs :

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

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

Si je clique sur "Ok" et sur mon mon bouton en ayant pris soin de mettre un point d'arrêt dans l'application ASP.NET :

Point d'arrêt dans l'application ASP.NET qui hoste le Service Logger
Clique sur le bouton Make Logs
Clique sur le bouton pour déclencher la méthode buttonMakeLog_Click() de l'application Silverlight qui déclenche un log à travers le service et dans l'application ASP.NET.

Le point d'arrêt est bien déclenché
Je ne dois pas être si loin, je vais continuer à trouver ...

Et comme je suis un fou furieux, en tous cas un curieux et maintenant que le code de mon service est généré dans Silverlight, je remets aspNetCompatibilityEnabled à true et j'exécute cette fois l'erreur est la suivante :

dans :

\\BusinessApplicationLog4Net\BusinessApplicationLog4Net\Service References\ServiceLogger\Reference.cs

j'obtiens :

Cette fois le Log ne sort plus de Silverlight

Solution

Il faut utiliser l'attribut de la Class :

    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
    public class ServiceLogger : IServiceLogger

Pour que cela fonctionne.



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