Végpontlétrehozás áttekintése
A Windows Communication Foundation (WCF) szolgáltatással folytatott összes kommunikáció a szolgáltatás végpontjain keresztül történik. A végpontok hozzáférést biztosítanak az ügyfeleknek a WCF szolgáltatás által kínált funkciókhoz. Ez a szakasz egy végpont struktúráját ismerteti, és ismerteti, hogyan definiálhat végpontokat konfigurációban és kódban.
Egy végpont felépítése
Minden végpont tartalmaz egy címet, amely jelzi a végpont helyét, egy kötést, amely meghatározza, hogy az ügyfél hogyan kommunikálhat a végponttal, valamint egy szerződést, amely azonosítja az elérhető módszereket.
Cím. A cím egyedileg azonosítja a végpontot, és tájékoztatja a potenciális fogyasztókat arról, hogy hol található a szolgáltatás. A WCF-objektummodellben EndpointAddress a cím jelöli, amely egy egységes erőforrás-azonosítót (URI) és címtulajdonságokat tartalmaz, amelyek identitást, néhány webszolgáltatás-leírási nyelvet (WSDL) és opcionális fejlécgyűjteményt tartalmaznak. Az opcionális fejlécek további részletes címzési információkat nyújtanak a végpont azonosításához vagy kezeléséhez. További információ: Végpontcím megadása.
Kötés. A kötés meghatározza, hogyan kommunikálhat a végponttal. A kötés meghatározza, hogy a végpont hogyan kommunikál a világgal, beleértve a használni kívánt átviteli protokollt (például TCP- vagy HTTP-protokollt), az üzenetek kódolását (például szöveg vagy bináris), és hogy mely biztonsági követelmények szükségesek (például a Secure Sockets Layer [SSL] vagy a SOAP üzenetbiztonság). További információ: A szolgáltatások és ügyfelek konfigurálása kötések használatával.
Szolgáltatási szerződés. A szolgáltatási szerződés ismerteti, hogy a végpont milyen funkciókat tesz elérhetővé az ügyfél számára. A szerződés meghatározza az ügyfél által meghívható műveleteket, az üzenet formáját, a művelet meghívásához szükséges bemeneti paraméterek vagy adatok típusát, valamint az ügyfél által várt feldolgozási vagy válaszüzenet típusát. Három alapszintű szerződéstípus felel meg az egyszerű üzenetcsere-mintáknak (EP-képviselők): datagram (egyirányú), kérés/válasz és kétirányú (kétirányú). A szolgáltatási szerződés adat- és üzenetszerződéseket is alkalmazhat, amelyek meghatározott adattípusokat és üzenetformátumokat igényelnek a hozzáféréskor. A szolgáltatási szerződések definiálásáról további információt a Szolgáltatásszerződések tervezése című témakörben talál. Vegye figyelembe, hogy az ügyfélnek szüksége lehet egy szolgáltatás által meghatározott, visszahívási szerződésnek nevezett szerződés implementálására is a szolgáltatástól érkező üzenetek kétoldalas európai parlamenti képviselőben való fogadásához. További információ: Duplex Services.
A szolgáltatás végpontja kód használatával vagy deklaratív módon, konfigurációval határozható meg. Ha nincs megadva végpont, akkor a futtatókörnyezet az alapértelmezett végpontokat úgy biztosítja, hogy minden egyes szolgáltatásszerződéshez hozzáad egy alapértelmezett végpontot a szolgáltatás által implementált minden egyes szolgáltatási szerződéshez. A végpontok kódban való definiálása általában nem praktikus, mivel az üzembe helyezett szolgáltatások kötései és címei általában eltérnek a szolgáltatás fejlesztése során használtaktól. Általában célszerűbb a szolgáltatásvégpontokat konfigurációval definiálni kód helyett. A kötés és az információk kódon kívüli kezelése lehetővé teszi a módosítást anélkül, hogy újrafordítanák és újra üzembe kellene helyezniük az alkalmazást.
Feljegyzés
Megszemélyesítést végző szolgáltatásvégpont hozzáadásakor vagy az AddServiceEndpoint egyik metódust vagy a GetContract(Type, Type) metódust kell használnia a szerződés új ServiceDescription objektumba való megfelelő betöltéséhez.
Végpontok definiálása a Kódban
Az alábbi példa bemutatja, hogyan adhat meg végpontot a kódban a következőkkel:
Adjon meg egy szerződést egy
IEcho
olyan szolgáltatástípushoz, amely elfogadja valaki nevét és visszhangját a "Hello <name>!" válaszsal.Echo
A szerződés általIEcho
meghatározott típusú szolgáltatás megvalósítása.Adja meg a szolgáltatás végpontcímét
http://localhost:8000/Echo
.Konfigurálja a
Echo
szolgáltatást kötéssel WSHttpBinding .
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()
Feljegyzés
A szolgáltatás gazdagépe alapcímmel jön létre, majd a többi cím az alapcímhez viszonyítva egy végpont részeként van megadva. A cím particionálása lehetővé teszi több végpont kényelmesebb definiálását egy gazdagép szolgáltatásai számára.
Feljegyzés
ServiceDescription A szolgáltatásalkalmazás tulajdonságai nem módosíthatók a OnOpening következő metódus ServiceHostBaseután: . Egyes tagok, például a Credentials tulajdonság és a AddServiceEndpoint
metódusok ServiceHostBaseServiceHostkivételt adnak, ha ezen a ponton módosítják. Mások engedélyezik a módosításukat, de az eredmény nincs meghatározva.
Hasonlóképpen, az ügyfélen az ServiceEndpoint értékek nem módosíthatók a hívás OnOpening után a ChannelFactory. A Credentials tulajdonság kivételt eredményez, ha az adott ponton már módosult. A többi ügyfélleírási érték hiba nélkül módosítható, de az eredmény nincs meghatározva.
Akár a szolgáltatás, akár az ügyfél esetében, javasoljuk, hogy a hívás Openelőtt módosítsa a leírást.
Végpontok meghatározása a konfigurációban
Alkalmazás létrehozásakor gyakran érdemes elhalasztani a döntéseket az alkalmazást üzembe helyező rendszergazdára. Például gyakran nem lehet előre tudni, hogy mi lesz a szolgáltatás címe (URI). A cím kemény kódolása helyett célszerű engedélyezni a rendszergazda számára, hogy ezt a szolgáltatás létrehozása után tegye meg. Ez a rugalmasság konfigurációval érhető el. További részletekért lásd a Szolgáltatások konfigurálása című témakört.
Feljegyzés
A ServiceModel metadata segédprogram (Svcutil.exe) és a/config:
fájlnév fájlnév[,
]
kapcsolójával gyorsan létrehozhat konfigurációs fájlokat.
Alapértelmezett végpontok használata
Ha nincs megadva végpont a kódban vagy a konfigurációban, akkor a futtatókörnyezet az alapértelmezett végpontokat úgy biztosítja, hogy minden szolgáltatásszerződéshez hozzáad egy alapértelmezett végpontot a szolgáltatás által implementált minden egyes szolgáltatási szerződéshez. Az alapcím megadható kódban vagy konfigurációban, és az alapértelmezett végpontok hozzáadódnak, amikor Open() a rendszer meghívja a ServiceHost. Ez a példa ugyanaz, mint az előző szakaszban, de mivel nincs megadva végpont, a rendszer hozzáadja az alapértelmezett végpontokat.
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()
Ha a végpontok explicit módon vannak megadva, az alapértelmezett végpontok továbbra is hozzáadhatók a ServiceHost hívás Openelőtti hívássalAddDefaultEndpoints. Az alapértelmezett végpontokról további információt a WCF-szolgáltatások egyszerűsített konfigurációja és egyszerűsített konfigurációja című témakörben talál.