Procedure: Een eenvoudige WCF-web-HTTP-service maken
Met Windows Communication Foundation (WCF) kunt u een service maken die een webeindpunt beschikbaar maakt. Webeindpunten verzenden gegevens via XML of JSON, er is geen SOAP-envelop. In dit onderwerp wordt gedemonstreert hoe u een dergelijk eindpunt beschikbaar maakt.
Notitie
De enige manier om een webeindpunt te beveiligen, is het beschikbaar maken via HTTPS, met behulp van transportbeveiliging. Wanneer u beveiliging op basis van berichten gebruikt, worden beveiligingsgegevens meestal in SOAP-headers geplaatst en omdat de berichten die worden verzonden naar niet-SOAP-eindpunten geen SOAP-envelop bevatten, is er nergens plaats voor de beveiligingsgegevens en moet u vertrouwen op transportbeveiliging.
Een webeindpunt maken
Definieer een servicecontract met behulp van een interface die is gemarkeerd met de ServiceContractAttributeen WebInvokeAttribute de WebGetAttribute kenmerken.
[ServiceContract] public interface IService { [OperationContract] [WebGet] string EchoWithGet(string s); [OperationContract] [WebInvoke] string EchoWithPost(string s); }
<ServiceContract()> _ Public Interface IService <OperationContract()> _ <WebGet()> _ Function EchoWithGet(ByVal s As String) As String <OperationContract()> _ <WebInvoke()> _ Function EchoWithPost(ByVal s As String) As String end interface
Notitie
Post-aanroepen worden standaard WebInvokeAttribute toegewezen aan de bewerking. U kunt echter de HTTP-methode (bijvoorbeeld HEAD, PUT of DELETE) opgeven om aan de bewerking toe te wijzen door een parameter 'method=' op te geven. WebGetAttribute heeft geen parameter 'method=' en wijst alleen GET-aanroepen toe aan de servicebewerking.
Implementeer het servicecontract.
public class Service : IService { public string EchoWithGet(string s) { return "You said " + s; } public string EchoWithPost(string s) { return "You said " + s; } }
Public Class Service Implements IService Public Function EchoWithGet(ByVal s As String) As String Implements IService.EchoWithGet Return "You said " + s End Function Public Function EchoWithPost(ByVal s As String) As String Implements IService.EchoWithPost Return "You said " + s End Function End Class
De service hosten
Maak een WebServiceHost object.
WebServiceHost host = new WebServiceHost(typeof(Service), new Uri("http://localhost:8000/"));
Dim host As WebServiceHost = New WebServiceHost(GetType(Service), New Uri("http://localhost:8000/"))
Voeg een ServiceEndpoint toe met de WebHttpBehavior.
ServiceEndpoint ep = host.AddServiceEndpoint(typeof(IService), new WebHttpBinding(), "");
Dim ep As ServiceEndpoint = host.AddServiceEndpoint(GetType(IService), New WebHttpBinding(), "")
Notitie
Als u geen eindpunt toevoegt, WebServiceHost wordt automatisch een standaardeindpunt gemaakt. WebServiceHost voegt WebHttpBehavior ook de HTTP Help-pagina en de WSDL GET-functionaliteit (Web Services Description Language) TOE en schakelt deze uit, zodat het eindpunt voor metagegevens geen invloed heeft op het standaard-HTTP-eindpunt.
Het toevoegen van een niet-SOAP-eindpunt met een URL van '' veroorzaakt onverwacht gedrag wanneer er een poging wordt gedaan om een bewerking op het eindpunt aan te roepen. De reden hiervoor is de listen-URI van het eindpunt hetzelfde als de URI voor de Help-pagina (de pagina die wordt weergegeven wanneer u naar het basisadres van een WCF-service bladert).
U kunt een van de volgende acties uitvoeren om te voorkomen dat dit gebeurt:
- Geef altijd een niet-lege URI op voor een niet-SOAP-eindpunt.
- Schakel de Help-pagina uit. Dit kan worden gedaan met de volgende code:
ServiceDebugBehavior sdb = host.Description.Behaviors.Find<ServiceDebugBehavior>(); sdb.HttpHelpPageEnabled = false;
Dim sdb As ServiceDebugBehavior = host.Description.Behaviors.Find(Of ServiceDebugBehavior)() sdb.HttpHelpPageEnabled = False
Open de servicehost en wacht totdat de gebruiker op Enter drukt.
host.Open(); Console.WriteLine("Service is running"); Console.WriteLine("Press enter to quit..."); Console.ReadLine(); host.Close();
host.Open() Console.WriteLine("Service is running") Console.WriteLine("Press enter to quit...") Console.ReadLine() host.Close()
In dit voorbeeld ziet u hoe u een webstijlservice host met een consoletoepassing. U kunt een dergelijke service ook hosten binnen IIS. Hiertoe geeft u de WebServiceHostFactory klasse in een .svc-bestand op zoals de volgende code laat zien.
<%ServiceHost language=c# Debug="true" Service="Microsoft.Samples.Service" Factory=System.ServiceModel.Activation.WebServiceHostFactory%>
Servicebewerkingen aanroepen die zijn toegewezen aan GET in een browser
- Open een webbrowser, voer de URL '
http://localhost:8000/EchoWithGet?s=Hello, world!
' in en druk op Enter. De URL bevat het basisadres van de service (http://localhost:8000/
), het relatieve adres van het eindpunt (""), de servicebewerking die moet worden aangeroepen ('EchoWithGet'), en een vraagteken gevolgd door een lijst met benoemde parameters, gescheiden door een ampersand (&).
Servicebewerkingen aanroepen in code
Maak een exemplaar van ChannelFactory<TChannel> binnen een
using
blok.using (ChannelFactory<IService> cf = new ChannelFactory<IService>(new WebHttpBinding(), "http://localhost:8000"))
Using cf As New ChannelFactory(Of IService)(New WebHttpBinding(), "http://localhost:8000")
Voeg WebHttpBehavior de aanroepen toe aan het eindpunt ChannelFactory<TChannel> .
cf.Endpoint.Behaviors.Add(new WebHttpBehavior());
cf.Endpoint.Behaviors.Add(New WebHttpBehavior())
Maak het kanaal en roep de service aan.
IService channel = cf.CreateChannel(); string s; Console.WriteLine("Calling EchoWithGet via HTTP GET: "); s = channel.EchoWithGet("Hello, world"); Console.WriteLine(" Output: {0}", s); Console.WriteLine(""); Console.WriteLine("This can also be accomplished by navigating to"); Console.WriteLine("http://localhost:8000/EchoWithGet?s=Hello, world!"); Console.WriteLine("in a web browser while this sample is running."); Console.WriteLine(""); Console.WriteLine("Calling EchoWithPost via HTTP POST: "); s = channel.EchoWithPost("Hello, world"); Console.WriteLine(" Output: {0}", s);
Dim channel As IService = cf.CreateChannel() Dim s As String Console.WriteLine("Calling EchoWithGet via HTTP GET: ") s = channel.EchoWithGet("Hello, world") Console.WriteLine(" Output: {0}", s) Console.WriteLine("") Console.WriteLine("This can also be accomplished by navigating to") Console.WriteLine("http://localhost:8000/EchoWithGet?s=Hello, world!") Console.WriteLine("in a web browser while this sample is running.") Console.WriteLine("") Console.WriteLine("Calling EchoWithPost via HTTP POST: ") s = channel.EchoWithPost("Hello, world") Console.WriteLine(" Output: {0}", s)
Sluit de WebServiceHost.
host.Close();
host.Close()
Opmerking
Hier volgt de volledige codevermelding voor dit voorbeeld.
// Service.cs
using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.ServiceModel.Web;
using System.Text;
namespace Microsoft.ServiceModel.Samples.BasicWebProgramming
{
[ServiceContract]
public interface IService
{
[OperationContract]
[WebGet]
string EchoWithGet(string s);
[OperationContract]
[WebInvoke]
string EchoWithPost(string s);
}
public class Service : IService
{
public string EchoWithGet(string s)
{
return "You said " + s;
}
public string EchoWithPost(string s)
{
return "You said " + s;
}
}
class Program
{
static void Main(string[] args)
{
WebServiceHost host = new WebServiceHost(typeof(Service), new Uri("http://localhost:8000/"));
try
{
ServiceEndpoint ep = host.AddServiceEndpoint(typeof(IService), new WebHttpBinding(), "");
host.Open();
using (ChannelFactory<IService> cf = new ChannelFactory<IService>(new WebHttpBinding(), "http://localhost:8000"))
{
cf.Endpoint.Behaviors.Add(new WebHttpBehavior());
IService channel = cf.CreateChannel();
string s;
Console.WriteLine("Calling EchoWithGet via HTTP GET: ");
s = channel.EchoWithGet("Hello, world");
Console.WriteLine(" Output: {0}", s);
Console.WriteLine("");
Console.WriteLine("This can also be accomplished by navigating to");
Console.WriteLine("http://localhost:8000/EchoWithGet?s=Hello, world!");
Console.WriteLine("in a web browser while this sample is running.");
Console.WriteLine("");
Console.WriteLine("Calling EchoWithPost via HTTP POST: ");
s = channel.EchoWithPost("Hello, world");
Console.WriteLine(" Output: {0}", s);
Console.WriteLine("");
}
Console.WriteLine("Press <ENTER> to terminate");
Console.ReadLine();
host.Close();
}
catch (CommunicationException cex)
{
Console.WriteLine("An exception occurred: {0}", cex.Message);
host.Abort();
}
}
}
}
'Service.cs
Imports System.Collections.Generic
Imports System.ServiceModel
Imports System.ServiceModel.Description
Imports System.ServiceModel.Web
Imports System.Text
<ServiceContract()> _
Public Interface IService
<OperationContract()> _
<WebGet()> _
Function EchoWithGet(ByVal s As String) As String
<OperationContract()> _
<WebInvoke()> _
Function EchoWithPost(ByVal s As String) As String
end interface
Public Class Service
Implements IService
Public Function EchoWithGet(ByVal s As String) As String Implements IService.EchoWithGet
Return "You said " + s
End Function
Public Function EchoWithPost(ByVal s As String) As String Implements IService.EchoWithPost
Return "You said " + s
End Function
End Class
Module program
Sub Main()
Dim host As WebServiceHost = New WebServiceHost(GetType(Service), New Uri("http://localhost:8000/"))
Try
Dim ep As ServiceEndpoint = host.AddServiceEndpoint(GetType(IService), New WebHttpBinding(), "")
host.Open()
Using cf As New ChannelFactory(Of IService)(New WebHttpBinding(), "http://localhost:8000")
cf.Endpoint.Behaviors.Add(New WebHttpBehavior())
Dim channel As IService = cf.CreateChannel()
Dim s As String
Console.WriteLine("Calling EchoWithGet via HTTP GET: ")
s = channel.EchoWithGet("Hello, world")
Console.WriteLine(" Output: {0}", s)
Console.WriteLine("")
Console.WriteLine("This can also be accomplished by navigating to")
Console.WriteLine("http://localhost:8000/EchoWithGet?s=Hello, world!")
Console.WriteLine("in a web browser while this sample is running.")
Console.WriteLine("")
Console.WriteLine("Calling EchoWithPost via HTTP POST: ")
s = channel.EchoWithPost("Hello, world")
Console.WriteLine(" Output: {0}", s)
Console.WriteLine("")
End Using
Console.WriteLine("Press <ENTER> to terminate")
Console.ReadLine()
host.Close()
Catch cex As CommunicationException
Console.WriteLine("An exception occurred: {0}", cex.Message)
host.Abort()
End Try
End Sub
End Module
De code compileren
Bij het compileren van Service.cs verwijzing System.ServiceModel.dll en System.ServiceModel.Web.dll.