Overzicht van het maken van eindpunten
Alle communicatie met een WCF-service (Windows Communication Foundation) vindt plaats via de eindpunten van de service. Eindpunten bieden de clients toegang tot de functionaliteit die een WCF-service biedt. In deze sectie wordt de structuur van een eindpunt beschreven en wordt beschreven hoe u een eindpunt in de configuratie en in code definieert.
De structuur van een eindpunt
Elk eindpunt bevat een adres dat aangeeft waar het eindpunt moet worden gevonden, een binding die aangeeft hoe een client kan communiceren met het eindpunt en een contract waarmee de beschikbare methoden worden geïdentificeerd.
Adres. Het adres identificeert het eindpunt op unieke wijze en vertelt potentiële consumenten waar de service zich bevindt. Het wordt weergegeven in het WCF-objectmodel door het EndpointAddress adres, dat een URI (Uniform Resource Identifier) en adreseigenschappen bevat die een identiteit, sommige WSDL-elementen (Web Services Description Language) en een verzameling optionele headers bevatten. De optionele headers bieden aanvullende gedetailleerde adresseringsinformatie om het eindpunt te identificeren of ermee te communiceren. Zie Een eindpuntadres opgeven voor meer informatie.
Binding. De binding geeft aan hoe moet worden gecommuniceerd met het eindpunt. De binding geeft aan hoe het eindpunt communiceert met de wereld, inclusief welk transportprotocol moet worden gebruikt (bijvoorbeeld TCP of HTTP), welke codering moet worden gebruikt voor de berichten (bijvoorbeeld tekst of binair), en welke beveiligingsvereisten nodig zijn (bijvoorbeeld Secure Sockets Layer [SSL] of SOAP-berichtbeveiliging). Zie Bindingen gebruiken om services en clients te configureren voor meer informatie.
Servicecontract. In het servicecontract wordt beschreven welke functionaliteit het eindpunt beschikbaar maakt voor de client. Een contract geeft de bewerkingen op die een client kan aanroepen, de vorm van het bericht en het type invoerparameters of gegevens dat nodig is om de bewerking aan te roepen, en het soort verwerkings- of antwoordbericht dat de client kan verwachten. Drie basistypen contracten komen overeen met basispatronen voor het uitwisselen van berichten (EP's): datagram (eenrichting), aanvraag/antwoord en dubbelzijdig (bidirectioneel). Het servicecontract kan ook gebruikmaken van gegevens- en berichtcontracten om specifieke gegevenstypen en berichtindelingen te vereisen wanneer ze worden geopend. Zie Servicecontracten ontwerpen voor meer informatie over het definiëren van een servicecontract. Houd er rekening mee dat een client mogelijk ook vereist is om een servicegedefinieerde contract, een callback-contract genoemd, te implementeren om berichten van de service te ontvangen in een duplex-MEP. Zie Duplex Services voor meer informatie.
Het eindpunt voor een service kan imperatief worden opgegeven met behulp van code of declaratief via configuratie. Als er geen eindpunten worden opgegeven, biedt de runtime standaardeindpunten door één standaardeindpunt toe te voegen voor elk basisadres voor elk servicecontract dat door de service wordt geïmplementeerd. Het definiëren van eindpunten in code is meestal niet praktisch omdat de bindingen en adressen voor een geïmplementeerde service doorgaans afwijken van de bindingen en adressen die worden gebruikt terwijl de service wordt ontwikkeld. Over het algemeen is het praktischer om service-eindpunten te definiëren met behulp van configuratie in plaats van code. Door de bindings- en adresseringsgegevens buiten de code te houden, kunnen ze worden gewijzigd zonder de toepassing opnieuw te hoeven compileren en opnieuw te implementeren.
Notitie
Wanneer u een service-eindpunt toevoegt dat imitatie uitvoert, moet u een van de AddServiceEndpoint methoden of de GetContract(Type, Type) methode gebruiken om het contract correct te laden in een nieuw ServiceDescription object.
Eindpunten definiëren in code
In het volgende voorbeeld ziet u hoe u een eindpunt in code opgeeft met het volgende:
Definieer een contract voor een
IEcho
type service dat iemands naam accepteert en echo met het antwoord 'Hallo <naam>!'.Implementeer een
Echo
service van het type dat door hetIEcho
contract is gedefinieerd.Geef een eindpuntadres op van
http://localhost:8000/Echo
de service.Configureer de
Echo
service met behulp van een WSHttpBinding binding.
namespace Echo
{
// Define the contract for the IEcho service
[ServiceContract]
public interface IEcho
{
[OperationContract]
String Hello(string name)
}
// Create an Echo service that implements IEcho contract
class Echo : IEcho
{
public string Hello(string name)
{
return "Hello" + name + "!";
}
public static void Main ()
{
//Specify the base address for Echo service.
Uri echoUri = new Uri("http://localhost:8000/");
//Create a ServiceHost for the Echo service.
ServiceHost serviceHost = new ServiceHost(typeof(Echo),echoUri);
// Use a predefined WSHttpBinding to configure the service.
WSHttpBinding binding = new WSHttpBinding();
// Add the endpoint for this service to the service host.
serviceHost.AddServiceEndpoint(
typeof(IEcho),
binding,
echoUri
);
// Open the service host to run it.
serviceHost.Open();
}
}
}
' Define the contract for the IEcho service
<ServiceContract()> _
Public Interface IEcho
<OperationContract()> _
Function Hello(ByVal name As String) As String
End Interface
' Create an Echo service that implements IEcho contract
Public Class Echo
Implements IEcho
Public Function Hello(ByVal name As String) As String _
Implements ICalculator.Hello
Dim result As String = "Hello" + name + "!"
Return result
End Function
' Specify the base address for Echo service.
Dim echoUri As Uri = New Uri("http://localhost:8000/")
' Create a ServiceHost for the Echo service.
Dim svcHost As ServiceHost = New ServiceHost(GetType(HelloWorld), echoUri)
' Use a predefined WSHttpBinding to configure the service.
Dim binding As New WSHttpBinding()
' Add the endpoint for this service to the service host.
serviceHost.AddServiceEndpoint(GetType(IEcho), binding, echoUri)
' Open the service host to run it.
serviceHost.Open()
Notitie
De servicehost wordt gemaakt met een basisadres en vervolgens wordt de rest van het adres, ten opzichte van het basisadres, opgegeven als onderdeel van een eindpunt. Door deze partitionering van het adres kunnen meerdere eindpunten handiger worden gedefinieerd voor services op een host.
Notitie
Eigenschappen van ServiceDescription de servicetoepassing mogen niet worden gewijzigd na de OnOpening methode op ServiceHostBase. Sommige leden, zoals de Credentials eigenschap en de AddServiceEndpoint
methoden waarop ServiceHostBase en ServiceHost, genereren een uitzondering als ze zijn gewijzigd na dat punt. Anderen kunnen ze wijzigen, maar het resultaat is niet gedefinieerd.
Op dezelfde manier mogen de ServiceEndpoint waarden op de client niet worden gewijzigd na de aanroep naar OnOpening de ChannelFactory. De Credentials eigenschap genereert een uitzondering als deze voorbij dat punt is gewijzigd. De andere clientbeschrijvingswaarden kunnen zonder fouten worden gewijzigd, maar het resultaat is niet gedefinieerd.
Of het nu gaat om de service of client, het wordt aanbevolen om de beschrijving te wijzigen voordat u aanroept Open.
Eindpunten definiëren in configuratie
Bij het maken van een toepassing wilt u vaak besluiten uitstellen aan de beheerder die de toepassing implementeert. Er is bijvoorbeeld vaak geen manier om vooraf te weten wat een serviceadres (een URI) zal zijn. In plaats van een adres hard te coderen, is het beter om een beheerder dit te laten doen na het maken van een service. Deze flexibiliteit wordt bereikt via configuratie. Zie Services configureren voor meer informatie.
Notitie
Gebruik het hulpprogramma hulpprogramma voor metagegevens van ServiceModel (Svcutil.exe) met de /config:
bestandsnaamschakelaar[,
]
om snel configuratiebestanden te maken.
Standaardeindpunten gebruiken
Als er geen eindpunten zijn opgegeven in code of in de configuratie, biedt de runtime standaardeindpunten door één standaardeindpunt toe te voegen voor elk basisadres voor elk servicecontract dat door de service wordt geïmplementeerd. Het basisadres kan worden opgegeven in code of in de configuratie en de standaardeindpunten worden toegevoegd wanneer Open() ze worden aangeroepen op de ServiceHost. Dit voorbeeld is hetzelfde voorbeeld uit de vorige sectie, maar omdat er geen eindpunten zijn opgegeven, worden de standaardeindpunten toegevoegd.
namespace Echo
{
// Define the contract for the IEcho service
[ServiceContract]
public interface IEcho
{
[OperationContract]
String Hello(string name)
}
// Create an Echo service that implements IEcho contract
public class Echo : IEcho
{
public string Hello(string name)
{
return "Hello" + name + "!";
}
public static void Main ()
{
//Specify the base address for Echo service.
Uri echoUri = new Uri("http://localhost:8000/");
//Create a ServiceHost for the Echo service.
ServiceHost serviceHost = new ServiceHost(typeof(Echo),echoUri);
// Open the service host to run it. Default endpoints
// are added when the service is opened.
serviceHost.Open();
}
}
}
' Define the contract for the IEcho service
<ServiceContract()> _
Public Interface IEcho
<OperationContract()> _
Function Hello(ByVal name As String) As String
End Interface
' Create an Echo service that implements IEcho contract
Public Class Echo
Implements IEcho
Public Function Hello(ByVal name As String) As String _
Implements ICalculator.Hello
Dim result As String = "Hello" + name + "!"
Return result
End Function
' Specify the base address for Echo service.
Dim echoUri As Uri = New Uri("http://localhost:8000/")
' Open the service host to run it. Default endpoints
' are added when the service is opened.
serviceHost.Open()
Als er expliciet eindpunten worden opgegeven, kunnen de standaardeindpunten nog steeds worden toegevoegd door het ServiceHost aanroepen aan te roepen voordat u aanroept.AddDefaultEndpointsOpen Zie Vereenvoudigde configuratie en vereenvoudigde configuratie voor WCF-services voor meer informatie over standaardeindpunten.