Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1909, comments - 2047, trackbacks - 352

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

Cookie e Privacy

Microsoft MVP

My MVP Profile

Microsoft Certified Professional

Microsoft Specialist

Xamarin Certified Mobile Developer

Il mio libro su VB 2015!

Pre-ordina il mio libro su VB 2015 Pre-ordina il mio libro "Visual Basic 2015 Unleashed". Clicca sulla copertina per informazioni!

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!

Altri spazi

GitHub
I miei progetti open-source su GitHub

Article Categories

Archives

Post Categories

Image Galleries

Privacy Policy

Creare un modello di progetto WCF per Visual Basic e C# Express 2008

Come probabilmente sapete (se poi avete preso il mio nuovo libro lo sapete già :-) ), le edizioni Express di Visual Basic e Visual C# 2008 non espongono un modello di progetto per creare librerie di servizi basate su Windows Communication Foundation, a differenza di quanto avveniva nella versione 2005. L'unico strumento Express che prevede questa funzionalità è Visual Web Developer 2008, che comunque svolge egregiamente il suo compito.

In realtà, VWD 2008 non genera una Dll, bensì un'applicazione Web pubblicabile su Internet Information Services. In effetti questo può essere un risultato soddisfacente, tuttavia può esserci la necessità di preferire una libreria vera e propria. Come fare allora se non si ha a disposizione il più completo Visual Studio 2008 ma solo VB o C# Express? La risposta è semplice: si crea "a mano" un modello di progetto personalizzato.

Fortunatamente, grazie a .NET Framework e ai suoi assembly, raggiungere questo obiettivo è piuttosto semplice e vedremo in questo post come fare, sia per Visual Basic 2008 che per Visual C# 3.0. Alla fine del post troverete i link per scaricare il modello bell'e pronto in formato .Vsi.

Avviate, quindi, Visual Basic 2008 Express o Visual C# Express e create un nuovo progetto di tipo Libreria di Classi e aggiungete un riferimento all'assembly System.ServiceModel.dll (l'assembly principale di WCF) e all'assembly System.Runtime.Serialization.Dll. Prenderemo spunto dal codice proposto nel modello di progetto per le edizioni 2005 Express e lo inseriremo nel nostro modello, con una importante differenza: il template per VS 2005 creava un servizio self-hosted (all'interno di un'applicazione Console), noi invece lo renderemo pubblicabile su IIS, poichè è uno scenario realistico mentre l'altro è più che altro didattico. Rinominate, quindi, il file Class1.vb/Class1.cs in IService1.vb/IService1.cs e digitate al suo interno il seguente codice:

Visual Basic:

Imports System.ServiceModel

Imports System.Runtime.Serialization

 

<ServiceContract()> _

Public Interface IService1

    <OperationContract()> _

    Function MyOperation1(ByVal myValue As String) As String

 

    <OperationContract()> _

    Function MyOperation2(ByVal dataContractValue1 As DataContract1) As String

 

End Interface

 

<DataContract()> _

Public Class DataContract1

    Private m_firstName As String

    Private m_lastName As String

 

    Public Property FirstName() As String

        Get

            Return m_firstName

        End Get

        Set(ByVal value As String)

            m_firstName = value

        End Set

    End Property

 

    Public Property LastName() As String

        Get

            Return m_lastName

        End Get

        Set(ByVal value As String)

            m_lastName = value

        End Set

    End Property

End Class

Visual C#:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.ServiceModel;

using System.Runtime.Serialization;

 

namespace WcfServiceLibrary

{

    [ServiceContract()]

    public interface IService1

    {

        [OperationContract]

        string MyOperation1(string myValue);

        [OperationContract]

        string MyOperation2(DataContract1 dataContractValue);

    }

 

    [DataContract]

    public class DataContract1

    {

        string firstName;

        string lastName;

 

        [DataMember]

        public string FirstName

        {

            get { return firstName; }

            set { firstName = value; }

        }

        [DataMember]

        public string LastName

        {

            get { return lastName; }

            set { lastName = value; }

        }

    }

}

Senza entrare nei dettagli (non è questa la sede), stiamo qui definendo il Contract e una classe che costituisce i dati che servizio e client potranno scambiare. Aggiungete, poi, un nuovo file di codice al progetto e rinominatelo in Service1.vb/Service1.cs. Il file dovrà definire una classe che implementi il contract, così come segue:

Visual Basic:

Public Class Service1

    Implements IService1

 

    Public Function MyOperation1(ByVal myValue As String) As String Implements IService1.MyOperation1

        Return "Hello: " + myValue

    End Function

 

    Public Function MyOperation2(ByVal dataContractValue1 As DataContract1) As String Implements IService1.MyOperation2

        Return "Hello: " + dataContractValue1.FirstName

    End Function

End Class

Visual C#:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

 

namespace WcfServiceLibrary

{

    public class service1 : IService1

    {

        public string MyOperation1(string myValue)

        {

            return "Hello: " + myValue;

        }

        public string MyOperation2(DataContract1 dataContractValue)

        {

            return "Hello: " + dataContractValue.FirstName;

        }

    }

}

 

A livello di codice abbiamo tutto. Ora, aggiungiamo un file di configurazione, sempre utilizzando il comando Project|Add new item. Se usate Visual C#, tra gli elementi disponibili è previsto il file di configurazione. Selezionatelo e assegnategli il nome Web.config. In Visual Basic, in cui i file di configurazione non sono previsti, selezionate un nuovo file di testo e assegnate ugualmente il nome Web.config. L'IDE riconosce l'estensione e classifica automaticamente il file come file di configurazione a struttura XML.

Il file di configurazione conterrà il seguente XML:

<?xml version="1.0" encoding="utf-8" ?>

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">

 

 

  <system.serviceModel>

    <services>

 

      <!--Sostituire con la classe che implementa il contract-->

      <service

          name="WcfServiceLibrary.Service1"

          behaviorConfiguration="MyServiceBehavior">

 

        <endpoint address=""

                  binding="basicHttpBinding"

                  contract="WcfServiceLibrary.IService1" />

      </service>

 

    </services>

 

    <behaviors>

      <serviceBehaviors>

 

        <behavior name="MyServiceBehavior">

          <serviceMetadata httpGetEnabled="true" />

        </behavior>

 

      </serviceBehaviors>

    </behaviors>

 

  </system.serviceModel>

</configuration>

L'ultimo passaggio è quello di aggiungere un file .Svc al progetto. Si può fare selezionando l'aggiunta di un nuovo file di testo, assegnandogli il nome Service.svc. Tale file conterrà il seguente codice:

Visual Basic:

<%@ServiceHost Language="vb" Debug="true" Service="WcfServiceLibrary1.Service1" %>

<%@ServiceHost Language="vb" Debug="true" Service="WcfServiceLibrary1.Service1" %>

Visual C#:

<%@ServiceHost Language="c#" Debug="true" Service="WcfServiceLibrary.Service1" %>

<%@ServiceHost Language="c#" Debug="true" Service="WcfServiceLibrary1.Service1" %>

Fatto! ora salvate il progetto. Potete esportarlo come modello di progetto utilizzando il comando File|Export template e seguendo le indicazioni del Wizard. Potrete anche decidere se importare automaticamente tra i modelli disponibili il nuovo template (scelta consigliata). Quando poi creerete un nuovo progetto basato su questo modello, a seconda del nome che specificherete, tutti i riferimenti al namespace di primo livello (che noi abbiamo specificato in modo generico) verranno aggiornati automaticamente con il nuovo. Bello no? :-)

Ho fatto un test e tutto funziona. Ho messo in pratica il primo esempio per WCF del mio libro, pubblicando il servizio su IIS e creando un'applicazione client con Visual Basic 2008 Express. Va che è una meraviglia! :-)

Se non volete perdere tempo a scrivere il codice di cui sopra, potete scaricare i due modelli che ho predisposto in formato .Vsi. I due pacchetti di installazione, uno per VB e uno per C#, installeranno automaticamente il modello al posto giusto. I due file sono stati realizzati con il mio tool Vsi Builder e sono disponibili a questi link:

Modello per Visual Basic 2008 Express

Modello per Visual C# 2008 Express

Alessandro

Print | posted on domenica 20 gennaio 2008 20:13 | Filed Under [ Visual Basic C# Visual Studio Express Editions Windows Communication Foundation ]

Powered by:
Powered By Subtext Powered By ASP.NET