Wilfried Woivré & .Net

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

WCF RIA Services et les Complex Type d’Entity Framework

MAI1

Actuellement, je suis en train de réaliser un projet pour une formation Silverlight, le but de ce projet est de réaliser un mini site eCommerce totalement en Silverlight. Il s’articule autour des technologies Entity Framework et RIA Services ainsi que Silverlight 4 avec un design pattern de type MVVM. J’utilise comme base de données AdventureWorksLT2008. Je donnerais tout le code de cette démonstration sur mon blog un autre jour, avec une explication un peu plus conséquente !

Enfin passons, pour ma vie, dans cet article je vais vous montrer comment renvoyer un Complex Type crée depuis EntityFramework et renvoyer dans notre Silverlight.

Je commence donc par créer un projet de type Silverlight Business Application, ensuite je crée un modèle Entity Framework, ici, on se basera uniquement sur la table Employees de NorthWind.

Sur cette table, je vais vouloir récupérer uniquement les noms et les prénoms des employés, afin de les renvoyer à mon application Silverlight, je vais donc créer un ComplexType contenant deux chaines de caractères.

J’en suis donc arrivé à un diagramme ressemblant à ceci :

image

Maintenant créons notre Domain Service, et notre requête Linq qui ressemble à cela :

[EnableClientAccess()]
public class NortwindDomainService : LinqToEntitiesDomainService<NorthwindEntities>
{

// TODO: Consider
// 1. Adding parameters to this method and constraining returned results, and/or
// 2. Adding query methods taking different parameters.
public IQueryable<EmployeeInformation> GetEmployees()
{
return from e in ObjectContext.Employees
select new EmployeeInformation() { FirstName = e.FirstName, LastName = e.LastName };
}
}

On s’apprête donc à créer une interface pour afficher les données en Silverlight, sauf qu’en compilant on obtient une erreur :

image

Il manque donc une clef à notre complex type, qu’à cela ne tienne, pour en rajouter une, il suffit de créer une classe partielle à notre type et d’y ajouter une clé.

public partial class EmployeeInformation
{
[Key]
[DataMember]
public int EmployeeInformationId { get; set; }
}

Maintenant que ce problème est réglé et qu’on a bien entendu ajouter la déclaration de notre clé dans notre requête, il faut passer au front, on va donc créer un liste qui affiche les noms et les prénoms des employés

On obtient un code de ce style :

public IEnumerable<Entity> Employees
{
get { return (IEnumerable<Entity>)GetValue(EmployeesProperty); }
set { SetValue(EmployeesProperty, value); }
}

// Using a DependencyProperty as the backing store for Employees.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty EmployeesProperty =
DependencyProperty.Register("Employees", typeof(IEnumerable<Entity>), typeof(MainPage), new PropertyMetadata(null));

public MainPage()
{
InitializeComponent();
this.DataContext = this;
this.Loaded += (sender, e) => LoadData();
}

private void LoadData()
{
NortwindDomainContext context = new NortwindDomainContext();
LoadOperation loadOp = context.Load(context.GetEmployeesQuery());
Employees = loadOp.Entities;
}

On charge donc le tout dans une liste que l’on expose à notre interface, le tout compile sans aucun problème on s’attend donc à voir un résultat, cependant on obtient encore une erreur :

image

On a donc une exception au niveau de notre DomainService, la requête quand à elle est bonne, le seul problème est en fait une erreur d’Entity Framework, on ne peut pas créer de Complex Type dans une requête Linq To Entities.

Il nous faut donc passer via un objet anonyme pour pouvoir ensuite instancier notre complex Type.

public IQueryable<EmployeeInformation> GetEmployees()
{
var employees = from e in ObjectContext.Employees
select new { e.EmployeeID, e.FirstName, e.LastName };

return employees.ToList().ConvertAll(e => new EmployeeInformation()
{
EmployeeInformationId = e.EmployeeID,
FirstName = e.FirstName,
LastName = e.LastName
}).AsQueryable();

}

On obtient donc par la suite nos différentes données :

image

Et voilà en espérant que cette technique vous sera utile dans vos futurs développements avec RIA Services ! En plus je vous fournis tout le code source !

image

Remonter

Des nouvelles de la PDC 2009 : Silverlight 4 Beta

NOVE21

Et voilà, comme je le suppose, vous avez tous du apprendre que Silverlight 4 Beta est disponible pour nous les développeurs ! Et sinon vous n’étiez pas au courant, voilà qui est fait. Alors je ne vais pas vous lister toutes les nouveautés de Silverlight 4, vu que d’autres l’ont déjà fait ! Mais voici un ensemble de liens ou vous pourrez voir tous les avantages de cette nouvelle version.

 

Le blog de Tim Heueur bien entendu : http://timheuer.com/blog/archive/2009/11/18/whats-new-in-silverlight-4-complete-guide-new-features.aspx Et la série d’article de Mike Taulty (qui soit dit en passant à réussi à faire perdre la tête à mon Netvibes)
Silverlight 4: Beta Announced at PDC
Silverlight 4 Rough Notes: Trusted Applications
Silverlight 4 Rough Notes: Camera and Microphone Support
Silverlight 4 Rough Notes: Printing
Silverlight 4 Rough Notes: HTML Hosting in the WebBrowser Control
Silverlight 4 Rough Notes: Notification Windows
Silverlight 4 Rough Notes: RichTextArea
Silverlight 4 Rough Notes: Networking
Silverlight 4 Rough Notes: FlowDirection
Silverlight 4 Rough Notes: Clipboard Access
Silverlight 4 Rough Notes: Silverlight as a Drop Target
Silverlight 4 Rough Notes: Right Mouse Button Support
Silverlight 4 Rough Notes: Binding
Silverlight 4 Rough Notes: Binding and IDataErrorInfo
Silverlight 4 Rough Notes: Binding with INotifyDataErrorInfo
Silverlight 4 Rough Notes: A Word for Visual Studio 2010
Silverlight 4 Rough Notes: Styles
Silverlight 4 Rough Notes: Commanding
Silverlight 4 Rough Notes: Customising the Window
Silverlight 4 Rough Notes: Animating Items Into/Out Of ItemsControls
Silverlight 4 Rough Notes: HTML interop & dynamic language features
Silverlight 4 Rough Notes: Data Grid Enhancements
Silverlight 4 Rough Notes: Taking Control of Navigation
Silverlight 4 Rough Notes: SelectedValue
Silverlight 4 Rough Notes: Mousewheel Support in Controls
Silverlight 4 Rough Notes: TextBlock with Trimming
Silverlight 4 Rough Notes: CompositeTransform
Silverlight 4 Rough Notes: Viewbox
Silverlight 4 Rough Notes: Managed Extensibility Framework

 

Et voilà de quoi occuper longuement votre weekend, et le mien aussi d’ailleurs.
Remonter