Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Per ospitare un servizio all'interno di un'applicazione gestita, incorporare il codice per il servizio all'interno del codice dell'applicazione gestita, definire un endpoint per il servizio in modo imperativo nel codice, in modo dichiarativo tramite la configurazione o usare endpoint predefiniti e quindi creare un'istanza di ServiceHost.
Per iniziare a ricevere messaggi, chiamare Open su ServiceHost. Questo crea e apre il listener per il servizio. L'hosting di un servizio in questo modo viene spesso definito "self-hosting" perché l'applicazione gestita esegue il lavoro di hosting stesso. Per chiudere il servizio, chiamare CommunicationObject.Close su ServiceHost.
Un servizio può anche essere ospitato in un servizio Windows gestito, in Internet Information Services (IIS) o nel servizio attivazione processi Windows (WAS). Per altre informazioni sulle opzioni di hosting per un servizio, vedere Servizi di hosting.
L'hosting di un servizio in un'applicazione gestita è l'opzione più flessibile perché richiede la distribuzione dell'infrastruttura minima. Per altre informazioni sull'hosting di servizi nelle applicazioni gestite, vedere Hosting in un'applicazione gestita.
La procedura seguente illustra come implementare un servizio self-hosted in un'applicazione console.
Creare un servizio auto-ospitato
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 Desktop di Windows.
Selezionare il modello App console . Digitare
SelfHost
nella casella Nome e quindi scegliere OK.
Fare clic con il pulsante destro del mouse su SelfHost in Esplora soluzioni e scegliere Aggiungi riferimento. Selezionare System.ServiceModel nella scheda .NET e quindi scegliere OK.
Suggerimento
Se la finestra Esplora soluzioni non è visibile, selezionare Esplora soluzioni dal menu Visualizza .
Fare doppio clic su Program.cs o 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. Questo esempio definisce un oggetto
HelloWorldService
che restituisce un messaggio basato sull'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.
Nella parte superiore del
Main
metodo creare un'istanza della Uri classe con l'indirizzo di base per il 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'istanza di Type che rappresenta il tipo di servizio e l'URI (Uniform Resource Identifier) dell'indirizzo di base verso ServiceHost(Type, Uri[]). Abilitare la pubblicazione dei metadati e quindi chiamare il Open metodo su ServiceHost per inizializzare il servizio e prepararlo per ricevere i 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 {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
Questo esempio usa gli endpoint predefiniti e non è necessario alcun file di configurazione per questo servizio. Se non sono configurati endpoint, il runtime crea un endpoint per ogni indirizzo di base per ogni contratto di servizio implementato dal servizio. Per altre informazioni sugli endpoint predefiniti, vedere Configurazione semplificata e Configurazione semplificata per i servizi WCF.
Premere CTRL+MAIUSC+B per compilare la soluzione.
Testare il servizio
Premere CTRL+F5 per eseguire il servizio.
Aprire il client di 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.
Selezionare Aggiungi servizio dal menu File .
Digitare
http://localhost:8080/hello
nella casella indirizzo e fare clic su OK.Suggerimento
Assicurarsi che il servizio sia in esecuzione, altrimenti questo passaggio fallirà. Se è stato modificato l'indirizzo di base nel codice, usare l'indirizzo di base modificato in questo passaggio.
Fare doppio clic su SayHello nel nodo Progetti servizio personali. Digitare il nome nella colonna Valore nell'elenco Richiesta e fare clic su Richiama.
Nell'elenco Risposta viene visualizzato un messaggio di risposta.
Esempio
Nell'esempio seguente viene creato un ServiceHost oggetto per ospitare un servizio di tipo HelloWorldService
e quindi viene chiamato il Open metodo su ServiceHost. Nel codice viene fornito un indirizzo di base, la pubblicazione dei metadati è abilitata e vengono usati gli 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 {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
Vedere anche
- Uri
- AppSettings
- ConfigurationManager
- Procedura: Ospitare un servizio WCF in IIS
- Self-host
- Servizi di hosting
- Procedura: Definire un contratto di servizio
- Procedura: Implementare un contratto di servizio
- ServiceModel Metadata Utility Tool (Svcutil.exe)
- Uso delle Associazioni per Configurare i Servizi e i Clienti
- System-Provided Binding