Megosztás a következőn keresztül:


Végpontcím megadása

A Windows Communication Foundation (WCF) szolgáltatással folytatott összes kommunikáció a végpontokon keresztül történik. Mindegyik ServiceEndpoint tartalmaz egy , egy BindingAddressés egy Contract. A szerződés meghatározza, hogy mely műveletek érhetők el. A kötés meghatározza a szolgáltatással való kommunikáció módját, a cím pedig azt határozza meg, hogy hol keresse meg a szolgáltatást. Minden végpontnak egyedi címmel kell rendelkeznie. A végpontcímet az EndpointAddress osztály jelöli, amely egy egységes erőforrás-azonosítót (URI) tartalmaz, amely a szolgáltatás címét, egy Identity, amely a szolgáltatás biztonsági identitását jelöli, valamint egy választható Headersgyűjteményt. Az opcionális fejlécek részletesebb címzési információkat nyújtanak a végpont azonosításához vagy kezeléséhez. Az élőfejek például jelezhetik, hogyan dolgozhatók fel a bejövő üzenetek, hol kell a végpontnak válaszüzenetet küldenie, vagy hogy egy szolgáltatás melyik példányát használja egy adott felhasználó bejövő üzenetének feldolgozására, ha több példány is elérhető.

Végpontcím definíciója

A WCF-ben a EndpointAddress WS-Addressing szabványban meghatározott végponthivatkozást (EPR) modellez.

A legtöbb szállítmány címének URI-címe négy részből áll. Az URI http://www.fabrikam.com:322/mathservice.svc/secureEndpoint például a következő négy részből áll:

  • Séma: http:

  • Gép: www.fabrikam.com

  • (Nem kötelező) Port: 322

  • Elérési út: /mathservice.svc/secureEndpoint

Az EPR-modell része, hogy minden végponthivatkozás tartalmazhat olyan referenciaparamétereket, amelyek további azonosítási információkat adnak hozzá. A WCF-ben ezek a referenciaparaméterek az AddressHeader osztály példányaiként modellezhetők.

A szolgáltatás végpontcíme kód használatával vagy deklaratív módon, konfigurációval határozható meg. 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. Ha nincs megadva végpont a kódban vagy a konfigurációban, akkor a futtatókörnyezet minden egyes, a szolgáltatás által implementált szerződéshez hozzáad egy alapértelmezett végpontot minden alapcímhez.

A WCF-ben kétféleképpen adhat meg végpontcímeket egy szolgáltatáshoz. Megadhatja a szolgáltatáshoz társított végpontok abszolút címét, vagy megadhat egy alapcímet egy szolgáltatáshoz, majd megadhatja a ServiceHost szolgáltatáshoz társított végpontok címét, amely az alapcímhez viszonyítva van meghatározva. Ezen eljárások mindegyikével megadhatja egy szolgáltatás végpontcímeit konfigurációban vagy kódban. Ha nem ad meg relatív címet, a szolgáltatás az alapcímet használja. Egy szolgáltatáshoz több alapcím is megadható, de minden egyes szolgáltatáshoz csak egy alapcím adható meg minden egyes átvitelhez. Ha több végponttal rendelkezik, amelyek mindegyike más kötéssel van konfigurálva, a címeknek egyedinek kell lenniük. Az azonos kötést, de különböző szerződéseket használó végpontok ugyanazt a címet használhatják.

Az IIS-vel való üzemeltetéskor nem saját maga kezeli a példányt ServiceHost . Az alapcím mindig a szolgáltatás .svc fájljában megadott cím az IIS-ben való üzemeltetéskor. Ezért relatív végpontcímeket kell használnia az IIS által üzemeltetett szolgáltatásvégpontokhoz. A teljes végpontcím megadása a szolgáltatás üzembe helyezésének hibáihoz vezethet. További információ: Internet Information Services által üzemeltetett WCF-szolgáltatás üzembe helyezése.

Végpontcímek definiálása a konfigurációban

Egy végpont konfigurációs fájlban való definiálásához használja a végpontelemet>.<

<configuration>
  <system.serviceModel>
    <services>
      <service name="UE.Samples.HelloService"
               behaviorConfiguration="HelloServiceBehavior">
        <endpoint address="/Address1"
                  binding="basicHttpBinding" 
                  contract="UE.Samples.IHello"/>

        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="HelloServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Open A metódus meghívásakor (vagyis amikor az üzemeltető alkalmazás megpróbálja elindítani a szolgáltatást), a rendszer egy <olyan szolgáltatáselemet> keres, amely egy "UE" nevet adja meg. Samples.HelloService". Ha a <szolgáltatáselem> megtalálható, a rendszer betölti a megadott osztályt, és végpontokat hoz létre a konfigurációs fájlban megadott végpontdefiníciók használatával. Ez a mechanizmus lehetővé teszi egy szolgáltatás betöltését és elindítását két sornyi kóddal, miközben a kötést és az információk a kódon kívülre történő kezelését is lehetővé teszi. Ennek a megközelítésnek az az előnye, hogy ezeket a módosításokat az alkalmazás újrafordítása vagy ismételt üzembe helyezése nélkül lehet végrehajtani.

Az opcionális fejlécek fejlécekben <vannak deklarálva>. Az alábbiakban egy olyan konfigurációs fájlban található szolgáltatás végpontjainak megadására használt elemeket mutatjuk be, amelyek két fejlécet különböztetnek meg: a "Gold" ügyfeleket http://tempuri1.org/ és a "Standard" ügyfeleket.http://tempuri2.org/ A szolgáltatást hívó ügyfélnek rendelkeznie kell a megfelelő <fejlécekkel> a konfigurációs fájlban.

<configuration>
  <system.serviceModel>
    <services>
      <service name="UE.Samples.HelloService"
               behaviorConfiguration="HelloServiceBehavior">
        <endpoint address="/Address1"
                  binding="basicHttpBinding" 
                  contract="UE.Samples.IHello">
          <headers>
            <Member xmlns="http://tempuri1.org/">Gold</Member>
          </headers>
        </endpoint>
        <endpoint address="/Address2"
          binding="basicHttpBinding" 
          contract="UE.Samples.IHello">
          <headers>
            <Member xmlns="http://tempuri2.org/">Silver</Member>
          </headers>
        </endpoint>

        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="HelloServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

A fejlécek az egyes üzenetekre is beállíthatók a végponton lévő összes üzenet helyett (ahogy korábban is láthattuk). Ez úgy történik OperationContextScope , hogy új környezetet hoz létre egy ügyfélalkalmazásban, hogy egyéni fejlécet adjon hozzá a kimenő üzenethez, ahogyan az az alábbi példában is látható.

SampleServiceClient wcfClient = new SampleServiceClient(new InstanceContext(this));
try
{
  using (OperationContextScope scope = new OperationContextScope(wcfClient.InnerChannel))
  {
    MessageHeader header
      = MessageHeader.CreateHeader(
      "Service-Bound-CustomHeader",
      "http://Microsoft.WCF.Documentation",
      "Custom Happy Value."
      );
    OperationContext.Current.OutgoingMessageHeaders.Add(header);

    // Making calls.
    Console.WriteLine("Enter the greeting to send: ");
    string greeting = Console.ReadLine();

    //Console.ReadLine();
    header = MessageHeader.CreateHeader(
        "Service-Bound-OneWayHeader",
        "http://Microsoft.WCF.Documentation",
        "Different Happy Value."
      );
    OperationContext.Current.OutgoingMessageHeaders.Add(header);

    // One-way
    wcfClient.Push(greeting);
    this.wait.WaitOne();

    // Done with service.
    wcfClient.Close();
    Console.WriteLine("Done!");
    Console.ReadLine();
  }
}
catch (TimeoutException timeProblem)
{
  Console.WriteLine("The service operation timed out. " + timeProblem.Message);
  Console.ReadLine();
  wcfClient.Abort();
}
catch (CommunicationException commProblem)
{
  Console.WriteLine("There was a communication problem. " + commProblem.Message);
  Console.ReadLine();
  wcfClient.Abort();
}
Dim wcfClient As New SampleServiceClient(New InstanceContext(Me))
Try
    Using scope As New OperationContextScope(wcfClient.InnerChannel)
        Dim header As MessageHeader = MessageHeader.CreateHeader("Service-Bound-CustomHeader", _
                            "http://Microsoft.WCF.Documentation", "Custom Happy Value.")
        OperationContext.Current.OutgoingMessageHeaders.Add(header)

        ' Making calls.
        Console.WriteLine("Enter the greeting to send: ")
        Dim greeting As String = Console.ReadLine()

        'Console.ReadLine();
        header = MessageHeader.CreateHeader("Service-Bound-OneWayHeader", _
                                            "http://Microsoft.WCF.Documentation", "Different Happy Value.")
        OperationContext.Current.OutgoingMessageHeaders.Add(header)

        ' One-way
        wcfClient.Push(greeting)
        Me.wait.WaitOne()

        ' Done with service. 
        wcfClient.Close()
        Console.WriteLine("Done!")
        Console.ReadLine()
    End Using
Catch timeProblem As TimeoutException
    Console.WriteLine("The service operation timed out. " & timeProblem.Message)
    Console.ReadLine()
    wcfClient.Abort()
Catch commProblem As CommunicationException
    Console.WriteLine("There was a communication problem. " & commProblem.Message)
    Console.ReadLine()
    wcfClient.Abort()
End Try

Végpont címe a metaadatokban

A végpontcímek a webszolgáltatások leírási nyelvében (WSDL) WS-Addressing EndpointReference (EPR) elemként jelenik meg a megfelelő végpont elemén wsdl:port belül. Az EPR tartalmazza a végpont címét és a címtulajdonságokat. Vegye figyelembe, hogy a belső wsdl:port EPR az alábbi példában látható módon cserélődik soap:Address le.

Végpontcímek definiálása a Kódban

A végpontcímek az osztály kódjában EndpointAddress hozhatók létre. A végpontcímhez megadott URI lehet teljes elérési út vagy a szolgáltatás alapcíméhez viszonyított elérési út. Az alábbi kód bemutatja, hogyan hozható létre az EndpointAddress osztály egy példánya, és hogyan adhatja hozzá a ServiceHost szolgáltatást üzemeltető példányhoz.

Az alábbi példa bemutatja, hogyan adhatja meg a teljes végpontcímet a kódban.

Uri baseAddress = new Uri("http://localhost:8000/HelloService");
string address = "http://localhost:8000/HelloService/MyService";

using (ServiceHost serviceHost = new ServiceHost(typeof(HelloService), baseAddress))
{
    serviceHost.AddServiceEndpoint(typeof(IHello), new BasicHttpBinding(), address);
    serviceHost.Open();
    Console.WriteLine("Press <enter> to terminate service");
    Console.ReadLine();
    serviceHost.Close();
}

Az alábbi példa bemutatja, hogyan adhat hozzá relatív címet ("MyService") a szolgáltatásgazda alapcíméhez.

Uri baseAddress = new Uri("http://localhost:8000/HelloService");

using (ServiceHost serviceHost = new ServiceHost(typeof(HelloService), baseAddress))
{
    serviceHost.AddServiceEndpoint(typeof(IHello), new BasicHttpBinding(), "MyService");
    serviceHost.Open();
    Console.WriteLine("Press <enter> to terminate service");
    Console.ReadLine();
    serviceHost.Close();
}

Feljegyzés

ServiceDescription A szolgáltatásalkalmazás tulajdonságai nem módosíthatók a metódust követően a OnOpening következőnServiceHostBase: . Egyes tagok, például a Credentials tulajdonság és a AddServiceEndpoint metódusok ServiceHostBaseServiceHostkivételt adnak, ha az adott pont után módosulnak. 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 pont után módosul. 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.

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.

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égpontokkal, kötésekkel és viselkedésekkel kapcsolatos további információkért lásd a WCF-szolgáltatások egyszerűsített konfigurációját és egyszerűsített konfigurációját.

Lásd még