Procedura: Ospitare un servizio WCF in un'app gestita
Per ospitare un servizio all'interno di un'applicazione gestita, incorporare il codice per il servizio nel codice dell'applicazione, definire un endpoint per il servizio in modo imperativo nel codice, in modo dichiarativo tramite la configurazione o tramite endpoint predefiniti, quindi creare un'istanza di ServiceHost.
Per iniziare a ricevere messaggi, chiamare Open su ServiceHost. In tal modo viene creato e aperto il listener per il servizio. Questo tipo di hosting di un servizio viene spesso chiamato "self-hosting"" perché è la stessa applicazione gestita a svolgere il lavoro di hosting. Per chiudere il servizio, chiamare CommunicationObject.Close su ServiceHost.
Un servizio può essere ospitato anche in un servizio Windows gestito, in Internet Information Services (IIS) o nel servizio Attivazione processo Windows (WAS). Per altre informazioni sulle opzioni di hosting per un servizio, vedere Servizi Hosting.
L'hosting di un servizio in un'applicazione gestita è l'opzione più flessibile perché richiede la distribuzione di un'infrastruttura minima. Per altre informazioni sui servizi hosting nelle applicazioni gestite, vedere Hosting in un'applicazione gestita.
Nella procedura seguente viene illustrato come implementare un servizio indipendente in un'applicazione console.
Creare un servizio indipendente
Creare una nuova applicazione console:
Aprire Visual Studio e selezionare Nuovo>Progetto dal menu File.
Nell'elenco Modelli installati selezionare Visual C# o Visual Basic e quindi selezionare Windows Desktop.
Selezionare il modello App console. Digitare
SelfHost
nella casella Nome, quindi scegliere OK.
Fare clic con il pulsante destro del mouse su SelfHost in Esplora soluzioni e selezionare Aggiungi riferimento. Selezionare System.ServiceModel nella scheda .NET e quindi scegliere OK.
Suggerimento
Se la finestra Esplora soluzioni non è visibile, selezionarla nel menu Visualizza.
Fare doppio clic su Program.cs o su Module1.vb in Esplora soluzioni per aprirlo nella finestra del codice, se non è già aperto. Aggiungere le istruzioni seguenti all'inizio del file :
using System.ServiceModel; using System.ServiceModel.Description;
Imports System.ServiceModel Imports System.ServiceModel.Description
Definire e implementare un contratto di servizio. In questo esempio viene definito un codice
HelloWorldService
che restituisce un messaggio in base all'input del servizio.[ServiceContract] public interface IHelloWorldService { [OperationContract] string SayHello(string name); } public class HelloWorldService : IHelloWorldService { public string SayHello(string name) { return string.Format("Hello, {0}", name); } }
<ServiceContract()> Public Interface IHelloWorldService <OperationContract()> Function SayHello(ByVal name As String) As String End Interface Public Class HelloWorldService Implements IHelloWorldService Public Function SayHello(ByVal name As String) As String Implements IHelloWorldService.SayHello Return String.Format("Hello, {0}", name) End Function End Class
Nota
Per altre informazioni su come definire e implementare un'interfaccia del servizio, vedere Procedura: Definire un contratto di servizio e Procedura: Implementare un contratto di servizio.
All'inizio del metodo
Main
, creare un'istanza della classe Uri con l'indirizzo di base del servizio.Uri baseAddress = new Uri("http://localhost:8080/hello");
Dim baseAddress As Uri = New Uri("http://localhost:8080/hello")
Creare un'istanza della classe ServiceHost, passando un Type che rappresenta il tipo di servizio e l'URI (Uniform Resource Identifier) dell'indirizzo di base a ServiceHost(Type, Uri[]). Abilitare la pubblicazione dei metadati, quindi chiamare il metodo Open sull'oggetto ServiceHost per inizializzare il servizio e prepararlo a ricevere messaggi.
// Create the ServiceHost. using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress)) { // Enable metadata publishing. ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15; host.Description.Behaviors.Add(smb); // Open the ServiceHost to start listening for messages. Since // no endpoints are explicitly configured, the runtime will create // one endpoint per base address for each service contract implemented // by the service. host.Open(); Console.WriteLine("The service is ready at {0}", baseAddress); Console.WriteLine("Press <Enter> to stop the service."); Console.ReadLine(); // Close the ServiceHost. host.Close(); }
' Create the ServiceHost. Using host As New ServiceHost(GetType(HelloWorldService), baseAddress) ' Enable metadata publishing. Dim smb As New ServiceMetadataBehavior() smb.HttpGetEnabled = True smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15 host.Description.Behaviors.Add(smb) ' Open the ServiceHost to start listening for messages. Since ' no endpoints are explicitly configured, the runtime will create ' one endpoint per base address for each service contract implemented ' by the service. host.Open() Console.WriteLine("The service is ready at {0}", baseAddress) Console.WriteLine("Press <Enter> to stop the service.") Console.ReadLine() ' Close the ServiceHost. host.Close() End Using
Nota
In questo esempio vengono utilizzati endpoint predefiniti e per il servizio non è necessario alcun file di configurazione. Se non è specificato alcun endpoint, il runtime ne crea uno per ogni indirizzo di base per ciascun contratto di servizio implementato dal servizio. Per altre informazioni sugli endpoint predefiniti, vedere Configurazione semplificata e Configurazione semplificata per servizi WCF.
Premere CTRL+MAIUSC+B per compilare la soluzione.
Eseguire il test del servizio
Premere CTRL+F5 per eseguire il servizio.
Aprire Client test WCF.
Suggerimento
Per aprire il client di test WCF, aprire il prompt dei comandi per gli sviluppatori per Visual Studio ed eseguire WcfTestClient.exe.
Scegliere Aggiungi servizio dal menu File.
Digitare
http://localhost:8080/hello
nella casella degli indirizzi, quindi fare clic su OK.Suggerimento
Verificare che il servizio sia in esecuzione. In caso contrario, il passaggio non viene eseguito. Se nel codice è stato modificato l'indirizzo di base, in questo passaggio utilizzare l'indirizzo di base modificato.
Fare doppio clic su SayHello nel nodo Progetti di servizio personali. Nella colonna Valore dell'elenco Richiesta digitare il proprio nome, quindi fare clic su Richiama.
Nell'elenco Risposta verrà visualizzato un messaggio di risposta.
Esempio
Nell'esempio seguente viene creato un oggetto ServiceHost per ospitare un servizio di tipo HelloWorldService
, quindi viene chiamato il metodo Open su ServiceHost. Nel codice viene fornito un indirizzo di base, viene abilitata la pubblicazione di metadati e vengono utilizzati endpoint predefiniti.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;
namespace SelfHost
{
[ServiceContract]
public interface IHelloWorldService
{
[OperationContract]
string SayHello(string name);
}
public class HelloWorldService : IHelloWorldService
{
public string SayHello(string name)
{
return string.Format("Hello, {0}", name);
}
}
class Program
{
static void Main(string[] args)
{
Uri baseAddress = new Uri("http://localhost:8080/hello");
// Create the ServiceHost.
using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
{
// Enable metadata publishing.
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
host.Description.Behaviors.Add(smb);
// Open the ServiceHost to start listening for messages. Since
// no endpoints are explicitly configured, the runtime will create
// one endpoint per base address for each service contract implemented
// by the service.
host.Open();
Console.WriteLine("The service is ready at {0}", baseAddress);
Console.WriteLine("Press <Enter> to stop the service.");
Console.ReadLine();
// Close the ServiceHost.
host.Close();
}
}
}
}
Imports System.ServiceModel
Imports System.ServiceModel.Description
Module Module1
<ServiceContract()>
Public Interface IHelloWorldService
<OperationContract()>
Function SayHello(ByVal name As String) As String
End Interface
Public Class HelloWorldService
Implements IHelloWorldService
Public Function SayHello(ByVal name As String) As String Implements IHelloWorldService.SayHello
Return String.Format("Hello, {0}", name)
End Function
End Class
Sub Main()
Dim baseAddress As Uri = New Uri("http://localhost:8080/hello")
' Create the ServiceHost.
Using host As New ServiceHost(GetType(HelloWorldService), baseAddress)
' Enable metadata publishing.
Dim smb As New ServiceMetadataBehavior()
smb.HttpGetEnabled = True
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
host.Description.Behaviors.Add(smb)
' Open the ServiceHost to start listening for messages. Since
' no endpoints are explicitly configured, the runtime will create
' one endpoint per base address for each service contract implemented
' by the service.
host.Open()
Console.WriteLine("The service is ready at {0}", baseAddress)
Console.WriteLine("Press <Enter> to stop the service.")
Console.ReadLine()
' Close the ServiceHost.
host.Close()
End Using
End Sub
End Module
Vedi anche
- Uri
- AppSettings
- ConfigurationManager
- Procedura: ospitare un servizio WCF in IIS
- Servizio indipendente
- Servizi di hosting
- Procedura: Definire un contratto di servizio
- Procedura: Implementare un contratto di servizio
- Strumento ServiceModel Metadata Utility Tool (Svcutil.exe)
- Uso di associazioni per configurare servizi e client
- Associazioni fornite dal sistema