Wilfried Woivré & .Net

Windows Azure : Développement en local

SEPT16

Bon cela fait un petit bout de temps que je n’ai pas bloggé ! Non pas par manque de sujet, mais plus par manque de temps….

 

Donc pour recommencer, une petite astuce pour Windows Azure, avec les récents Tools qui sont sortis, une panoplie de nouvelles fonctionnalités sont apparues ! Et notamment une modification au niveau des performances de l’émulateur dont vous vous servez en développement.

 

Vu les nouvelles performances qui sont très acceptables, si vous êtes dans le même cas que moi et que le ventilateur de votre machine commence à essayer de tourner plus vite qu’il ne le doit dès que l’émulateur démarre, une nouvelle fonctionnalité est apparue dans les propriétés des projets Windows Azure

 

image

Et oui on peut enfin couper l’émulateur de storage Azure, alors si comme moi, vous faites tous vos projets avec essentiellement des données dans Azure, n’hésitez pas à le couper votre PC vous remerciera plus tard !

 

On notera au passage, qu’on peut enfin avoir le choix entre plusieurs configurations ce qui peut être sympa quand vous avez des config de production, et de développement qui sont différentes. De même vous pouvez traiter les Warnings comme des erreurs, option bien pratique puisqu’elle vous permet d’être averti lorsque vous faites référence à une assembly ne se trouvant pas dans le GAC et que vous avez oublié d’activer la copie de celle-ci ! Et c’est clairement mieux un message d’erreur que 20 min d’attente pour voir via l’Intellitrace que votre application cherche encore l’assembly….

 

J’ai quelques articles en cours ! Mais n’hésitez pas à m’envoyer un message si vous désirez des infos plus précises sur Azure notamment !

Remonter

Silverlight & WCF : Interroger un service via une url relative

JUIN23

Quand on développe une application Silverlight, on a souvent besoin de s’abonner à des services afin d’accéder aux données situées sur un serveur distant, on créé donc le plus généralement un service WCF qui exposera nos données.

Si vous n’utilisez pas IIS pour vos développements, vous avez du remarquer, du moins je l’espère, que Visual Studio démarre un serveur web allégé qui hébergera votre application. On accède donc à notre application via une url de ce type http://localhost:24421/MaSuperApplicationQuiDeboiteTestPage.aspx jusque là aucun problème votre application marche et vous avez accès à votre service via cette url : http://localhost:24421/MonSuperServiceQuiDeboite.svc.

 

Donc quand vous vous abonnez au service via Visual Studio, il va vous générer le proxy, ainsi qu’un fichier de config avec les données de configuration du service, comme on peut le voir ci-dessous :

<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IService1" maxBufferSize="2147483647"
                    maxReceivedMessageSize="2147483647">
                    <security mode="None" />
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:20624/Service1.svc" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService1"
                name="BasicHttpBinding_IService1" />
        </client>
    </system.serviceModel>
</configuration>

Le problème que l’on peut cependant obtenir et que Visual Studio, selon son humeur, peut décider de changer le port de votre application, et donc vos informations de connexion seront incorrectes. Vous pouvez donc soit fixer le port du serveur web, soit changer ces informations comme on va le voir par la suite. Plus concrètement, ce problème arrive très souvent lorsque vous faites du développement pour Azure avec l’émulateur qui vous génère une url de ce type http://127.0.0.1:81, le port peut changer si vous quittez l’appli brutalement, typiquement lorsque vous avec un point d’arrêt déclenché dans votre Visual Studio et que vous arrêtez le debug !

 

Alors pour éviter le soucis, il vous suffit de mettre votre adresse de service en relative, comme ci dessous

<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IService1" maxBufferSize="2147483647"
                    maxReceivedMessageSize="2147483647">
                    <security mode="None" />
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="/Service1.svc" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService1"
                name="BasicHttpBinding_IService1" />
        </client>
    </system.serviceModel>
</configuration>

C’est beaucoup mieux que de reconstruire l’url du service à partir de l’url courante !

Remonter

Afficher des informations dans la fenêtre de sortie de Visual Studio

MAI19

Quand on fait du XAML que ce soit en WPF, Silverlight ou WP7, on est bien heureux de voir apparaitre ces petits messages d’erreur dans la fenêtre de sortie lorsque l’on est en mode debug de notre application !

Ici comme on peut le voir il s’agit uniquement d’une erreur de binding, qui nous informe que la propriété “FirstName” n’a pas été trouvée :

 

image

 

Et si on voyait comment ajouter nos propres messages dans cette fenêtre, et bien tout est là pour nous aider, c’est très facilement faisable grâce au namespace System.Diagnotics

 

this.Loaded += (sender, e) => System.Diagnostics.Debug.Print("Message perso => Un petit test ?");

On obtient en mode DEBUG, notre message personnel dans la fenêtre de sortie

image

Et comme la vie est bien faite, en mode release, rien n’apparait !

 

Bon bien entendu, rien ne sert de polluer cette fenêtre outre mesure, mais c’est toujours mieux qu’une trentaine de message box d’information pour lancer votre programme et être sûr que tout ce passe bien !

Remonter

Créer ses templates sous Visual Studio 2010

AVRI4

Visual Studio 2010 étant un outil formidable, il a surtout l’avantage de pouvoir être enrichi soit par des plugins, soit par de nouveaux templates de projets ou d’éléments. Nous allons voir aujourd’hui comment créer ses différents templates.

Prenons les templates de projets qui par défaut vous permettent facilement de créer des applications, cependant si vous êtes comme moi, vous êtes à chaque fois obligé de faire quelques petites modifications avant de commencer à proprement dit le code. Par exemple ajouter les différentes classes pour faire du MVVM, on va donc créer un nouveau template de projet qui contient par défaut les classes dont nous avons besoin. Pour cela rien de plus il suffit d’ouvrir Visual Studio et de créer un projet de départ qui correspond à vos besoins.

image

Le nom du projet importe peu, donc vous pouvez laisser celui par défaut. Ensuite vous n’avez qu’à modifier votre projet selon vos besoins, donc dans mon exemple, il faut uniquement ajouter une classe ViewModelBase, l’implémenter et déplacer le fichier MainWindow dans un dossier Views comme on peut le voir ci dessous

 

image

 

Bon c’est assez basique comme modification, mais vous pouvez rajouter bien d’autres choses, comme plus de classes, des références ! Et beaucoup de code préexistant que vous avez déjà !

Maintenant on va donc créer un template de tout ça ! Et quand je disais que Visual Studio était un outil formidable, je ne blaguais pas, puisque c’est tout simplement dans le menu File/Export Template … On a donc une fenêtre de ce type qui apparait

image

On va donc pouvoir choisir de créer soit un template de projet, soit un template de fichier. Commençons donc par le template de projet :

image

On va donc pouvoir le nommer, ainsi que lui ajouter une description et différentes images. De plus il est possible d’importer directement le projet dans Visual Studio, ce que l’on ne va pas faire pour le moment. Il suffit de terminer l’assistant, et là on va avoir une fenêtre explorer qui va s’ouvrir contenant un zip de notre application. On va donc l’extraire pour en analyser le contenu qui est celui-ci

image

On voit donc non pas par magie notre projet accompagné d’un fichier Icône ainsi qu’un fichier appelé MyTemplate qui est en fait un fichier XML que l’on va analyser

<VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Project">
  <TemplateData>
    <Name>WPF Application with MVVM</Name>
    <Description>Application WPF with ViewModelBase</Description>
    <ProjectType>CSharp</ProjectType>
    <ProjectSubType>
    </ProjectSubType>
    <SortOrder>1000</SortOrder>
    <CreateNewFolder>true</CreateNewFolder>
    <DefaultName>Application WPF with MVVM</DefaultName>
    <ProvideDefaultName>true</ProvideDefaultName>
    <LocationField>Enabled</LocationField>
    <EnableLocationBrowseButton>true</EnableLocationBrowseButton>
    <Icon>__TemplateIcon.ico</Icon>
  </TemplateData>
  <TemplateContent>
    <Project TargetFileName="WpfApplication5.csproj" File="WpfApplication5.csproj" ReplaceParameters="true">
      <ProjectItem ReplaceParameters="true" TargetFileName="App.xaml">App.xaml</ProjectItem>
      <ProjectItem ReplaceParameters="true" TargetFileName="App.xaml.cs">App.xaml.cs</ProjectItem>
      <Folder Name="Properties" TargetFolderName="Properties">
        <ProjectItem ReplaceParameters="true" TargetFileName="AssemblyInfo.cs">AssemblyInfo.cs</ProjectItem>
        <ProjectItem ReplaceParameters="true" TargetFileName="Resources.resx">Resources.resx</ProjectItem>
        <ProjectItem ReplaceParameters="true" TargetFileName="Resources.Designer.cs">Resources.Designer.cs</ProjectItem>
        <ProjectItem ReplaceParameters="true" TargetFileName="Settings.settings">Settings.settings</ProjectItem>
        <ProjectItem ReplaceParameters="true" TargetFileName="Settings.Designer.cs">Settings.Designer.cs</ProjectItem>
      </Folder>
      <Folder Name="ViewModels" TargetFolderName="ViewModels">
        <ProjectItem ReplaceParameters="true" TargetFileName="ViewModelBase.cs">ViewModelBase.cs</ProjectItem>
      </Folder>
      <Folder Name="Views" TargetFolderName="Views">
        <ProjectItem ReplaceParameters="true" TargetFileName="MainWindow.xaml">MainWindow.xaml</ProjectItem>
        <ProjectItem ReplaceParameters="true" TargetFileName="MainWindow.xaml.cs">MainWindow.xaml.cs</ProjectItem>
      </Folder>
    </Project>
  </TemplateContent>
</VSTemplate>

 

Donc on peut voir qu’il référence tout le contenu de mon template, ainsi que toutes les informations que j’ai renseigné lors de mon export. Et une dernière chose, qui est le nom par défaut du projet. Et comme on peut le voir ici “WPF Application With ViewModelBase” n’est pas un nom super sexy pour un projet, et de plus il contient des espaces, on va donc le remplacer par un simple WpfApplication. Puis en suite réinjecter le fichier Template dans le zip initialement créé, où en créer un nouveau. Il faut ensuite importer ce projet dans Visual Studio, pour cela il vous suffit d’aller dans le dossier Visual Studio, dans vos documents, et d’y ajouter votre zip comme ci-dessous

image

Et là, vu que la vie est très faite, vous pouvez voir votre projet dans Visual Studio

 

image

 

On notera donc qu’il est préférable de bien mettre une icône histoire que ce soit esthétiquement plus sympatique pour le développeur. Quand on créé un nouveau projet de ce type, appelé par exemple ApplicationTest, on peut voir que Visual Studio se charge bien de renommer correctement les namespaces selon la solution

image

Donc maintenant qu’on a créé notre nouveau template de projet, passons au template de fichier. On va donc créer un fichier de type ViewModel, et commencer son application, on va donc avoir un rendu de ce type

using System;

namespace WpfApplication5.ViewModels
{
    public class MainViewModel : ViewModelBase
    {
        public override void OnLoaded()
        {
            throw new NotImplementedException();
        }

        public override void OnUnloaded()
        {
            throw new NotImplementedException();
        }
    }
}
Quand on export un Item, on voit apparaître un écran qui nous permet de choisir le fichier que l’on veut exporter
image

On doit ensuite ajouter les différentes références que l’on veut inclure de base dans notre fichier

image

 

Il suffit après de l’enregistré et de le mettre dans votre dossier ItemTemplate de Visual Studio, comme on peut le voir ci-dessous.

image

On le retrouve donc bien dans notre Visual Studio selon l’arborescence qu’on a défini

 

image

Bien entendu le nom de la classe est correctement modifié lorsqu’on créé un nouvel élément.

 

Voilà une petite astuce qui peut vous être utile si vous voulez encore un peu plus customiser votre Visual Studio, ou même si vous voulez modifier les projets de bases qui y sont disponibles.

Remonter

Entity Framework : LoadProperty, des erreurs à éviter !

MARS9

La fonction LoadProperty dans Entity Framework vous permet de charger les différentes propriétés d’une entité selon les conditions de navigations qui sont définies dans le Model.

Pour voir ce que vous pouvez réaliser avec cette méthode, je ne peux que vous conseiller que de consulter MSDN !

 

Bon c’est bien beau, mais parfois vous pouvez avoir différents bugs, je vais donc vous en montrer deux avec les différents messages d’erreurs associés. Prenons donc le code suivant, basé sur Northwind, il compile correctement.

var entities = new NorthwindEntities();
var result = entities.Region;
foreach (var item in result)
    entities.LoadProperty(item, "Territory");

foreach (var item in result)
{
    Console.WriteLine(String.Format("Region : {0}, nb de territoires {1}",
        item.RegionDescription.Trim(),
        item.Territories.Count));
}
 

On a donc une première erreur à l’exécution

image
 

Bon le message de l’erreur est clair, il faut mettre la propriété de navigation qui est “Territories” et non “Territory”, il vous faut donc faire attention, puisque contrairement aux requêtes Linq, ici, on se base sur des chaines de caractères et donc susceptibles aux erreurs.

 

Bon maintenant qu’on a corrigé cela, passons à la deuxième erreur que nous affiche gentiment Visual Studio

 

image

 

Bon cette erreur est déjà un peu moins explicite que la précédente, si l’on regarde le message de l’InnerException, on peut voir ce message d’erreur

“There is already an open DataReader associated with this Command which must be closed first.”

Donc après quelques recherches non fructueuses, le problème vient de la chaine de connexion généré par l’utilitaire Entity Framework qui a indiqué ceci :

    <add name="NorthwindEntities" 
         connectionString="metadata=res://*/NWModel.csdl|res://*/NWModel.ssdl|res://*/NWModel.msl;
         provider=System.Data.SqlClient;
         provider connection string=&quot;
         Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;
         Integrated Security=True;MultipleActiveResultSets=False&quot;" 
         providerName="System.Data.EntityClient" />

 

Bien qu’elle a l’air correct (et d’ailleurs, elle l’est), elle ne permet pas d’effectuer deux requêtes en même temps par connexion à cause de la propriétés MultipleActiveResultSets qui est à false, il vous suffit donc de le mettre à true, et le tour est joué !

 

Bon ce cas m’est arrivé avec une connexion à une base SQL Azure, puisque sinon il me génère correctement la chaine de connexion pour autoriser le LoadProperty.

 

Voilà en espérant que ça vous soit utile à vous aussi !

Remonter