Aracılığıyla paylaş


Bir Uç Noktası Adresi Belirtme

Windows Communication Foundation (WCF) hizmetiyle tüm iletişimler uç noktaları üzerinden gerçekleşir. Her ServiceEndpoint birinde bir Address, ve Bindingbir Contractbulunur. Sözleşme hangi işlemlerin kullanılabilir olduğunu belirtir. Bağlama, hizmetle nasıl iletişim kurabileceğinizi, adres ise hizmetin nerede bulunacağı belirtir. Her uç noktanın benzersiz bir adresi olmalıdır. Uç nokta adresi, hizmetin adresini temsil eden bir Tekdüzen Kaynak Tanımlayıcısı (URI), hizmetin güvenlik kimliğini temsil eden bir Identityve isteğe bağlı Headersbir koleksiyonu içeren sınıfıyla EndpointAddress temsil edilir. İsteğe bağlı üst bilgiler, uç noktayı tanımlamak veya bunlarla etkileşime geçmek için daha ayrıntılı adresleme bilgileri sağlar. Örneğin, üst bilgiler gelen iletinin nasıl işlendiği, uç noktanın yanıt iletisi göndermesi gereken yeri veya birden çok örnek mevcut olduğunda belirli bir kullanıcıdan gelen iletiyi işlemek için kullanılacak hizmetin hangi örneğini gösterebilirsiniz.

Uç Nokta Adresinin Tanımı

WCF'de, EndpointAddress WS-Addressing standardında tanımlandığı gibi bir uç nokta başvurusu (EPR) modeller.

Çoğu aktarım için adres URI'sinin dört bölümü vardır. Örneğin, bu URI http://www.fabrikam.com:322/mathservice.svc/secureEndpoint aşağıdaki dört bölüme sahiptir:

  • Şema: http:

  • Makine: www.fabrikam.com

  • (İsteğe bağlı) Bağlantı noktası: 322

  • Yol: /mathservice.svc/secureEndpoint

EPR modelinin bir parçası, her uç nokta başvurusunun ek tanımlayıcı bilgiler ekleyen bazı başvuru parametrelerini taşıyabilmesidir. WCF'de bu başvuru parametreleri sınıfın AddressHeader örnekleri olarak modellenir.

Bir hizmetin uç nokta adresi, kod kullanılarak kesin olarak veya yapılandırma aracılığıyla bildirim temelli olarak belirtilebilir. Dağıtılan bir hizmetin bağlamaları ve adresleri genellikle hizmet geliştirilirken kullanılanlardan farklı olduğundan, kodda uç noktaları tanımlamak genellikle pratik değildir. Genellikle, kod yerine yapılandırma kullanarak hizmet uç noktalarını tanımlamak daha pratiktir. Bağlama ve adresleme bilgilerinin kod dışında tutulması, uygulamanın yeniden derlenmesi ve yeniden dağıtılması gerekmeden bunların değişmesine olanak tanır. Kodda veya yapılandırmada hiçbir uç nokta belirtilmezse, çalışma zamanı hizmet tarafından uygulanan her sözleşme için her temel adrese bir varsayılan uç nokta ekler.

WCF'de bir hizmet için uç nokta adreslerini belirtmenin iki yolu vardır. Hizmetle ilişkili her uç nokta için mutlak bir adres belirtebilir veya bir hizmetin temel adresini ServiceHost sağlayabilir ve ardından bu hizmetle ilişkili her uç nokta için bu temel adrese göre tanımlanan bir adres belirtebilirsiniz. Yapılandırmada veya kodda bir hizmetin uç nokta adreslerini belirtmek için bu yordamların her birini kullanabilirsiniz. Göreli bir adres belirtmezseniz, hizmet temel adresi kullanır. Bir hizmet için birden çok temel adresiniz de olabilir, ancak her hizmet her aktarım için yalnızca bir temel adrese izin verilir. Her biri farklı bir bağlamayla yapılandırılmış birden çok uç noktanız varsa, bunların adresleri benzersiz olmalıdır. Aynı bağlamayı ama farklı sözleşmeleri kullanan uç noktalar aynı adresi kullanabilir.

IIS ile barındırırken örneği kendiniz yönetmezsiniz ServiceHost . Temel adres her zaman IIS'de barındırılırken hizmetin .svc dosyasında belirtilen adrestir. Bu nedenle, IIS tarafından barındırılan hizmet uç noktaları için göreli uç nokta adreslerini kullanmanız gerekir. Tam uç nokta adresi sağlamak, hizmetin dağıtımında hatalara yol açabilir. Daha fazla bilgi için bkz . Internet Information Services Tarafından Barındırılan WCF Hizmeti Dağıtma.

Yapılandırmada Uç Nokta Adreslerini Tanımlama

Yapılandırma dosyasında uç nokta tanımlamak için endpoint> öğesini kullanın<.

<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 Yöntem çağrıldığında (yani barındırma uygulaması hizmeti başlatmaya çalıştığında), sistem>< "UE. Samples.HelloService". <Hizmet> öğesi bulunursa, sistem belirtilen sınıfı yükler ve yapılandırma dosyasında sağlanan uç nokta tanımlarını kullanarak uç noktalar oluşturur. Bu mekanizma, bağlama ve adresleme bilgilerini kodunuzun dışında tutarken iki kod satırıyla bir hizmeti yükleyip başlatmanıza olanak tanır. Bu yaklaşımın avantajı, bu değişikliklerin uygulamayı yeniden derlemek veya yeniden dağıtmak zorunda kalmadan yapılabilmesidir.

İsteğe bağlı üst bilgiler üst <bilgilerde> bildirilir. İki üst bilgiyi birbirinden ayıran yapılandırma dosyasındaki bir hizmetin uç noktalarını belirtmek için kullanılan öğelere bir örnek aşağıda verilmiştir: "Gold" istemcileri ve 'den http://tempuri1.org/http://tempuri2.org/"Standart" istemciler. Bu hizmeti çağıran istemcinin yapılandırma dosyasında uygun <üst bilgiler> olmalıdır.

<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>

Üst bilgiler, bir uç noktadaki tüm iletiler (daha önce gösterildiği gibi) yerine tek tek iletilere de ayarlanabilir. Bu, aşağıdaki örnekte gösterildiği gibi giden iletiye özel üst bilgi eklemek üzere istemci uygulamasında yeni bir bağlam oluşturmak için kullanılarak OperationContextScope gerçekleştirilir.

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

Meta Verilerde Uç Nokta Adresi

Uç nokta adresi, Web Hizmetleri Açıklama Dili'nde (WSDL) ilgili uç noktanın wsdl:port öğesi içinde WS-Addressing EndpointReference (EPR) öğesi olarak gösterilir. EPR, uç noktanın adresini ve tüm adres özelliklerini içerir. aşağıdaki örnekte görüldüğü gibi içindeki wsdl:port EPR'nin değiştirildiğini soap:Address unutmayın.

Kodda Uç Nokta Adreslerini Tanımlama

Sınıfıyla EndpointAddress kodda bir uç nokta adresi oluşturulabilir. Uç nokta adresi için belirtilen URI tam yol veya hizmetin temel adresine göre bir yol olabilir. Aşağıdaki kod, sınıfının bir örneğinin EndpointAddress nasıl oluşturulacağını ve hizmeti barındıran örneğe nasıl ekleneceğini ServiceHost gösterir.

Aşağıdaki örnek, kodda tam uç nokta adresinin nasıl belirtileceğini gösterir.

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();
}

Aşağıdaki örnekte, hizmet ana bilgisayarının temel adresine göreli adresin ("MyService") nasıl ekleneceği gösterilmektedir.

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();
}

Not

'nin ServiceDescription hizmet uygulamasındaki özellikleri, üzerindeki ServiceHostBaseyönteminden OnOpening sonra değiştirilmemelidir. ve üzerindeki özellikleri ve AddServiceEndpoint yöntemleri ServiceHostBaseServiceHostgibi Credentials bazı üyeler, bu noktadan sonra değiştirilirse bir özel durum oluşturur. Diğerleri bunları değiştirmenize izin verir, ancak sonuç tanımlanmamıştır.

Benzer şekilde, istemcide ServiceEndpoint üzerinde çağrısından OnOpeningChannelFactorysonra değerler değiştirilmemelidir. özelliği, Credentials bu noktadan sonra değiştirilirse bir özel durum oluşturur. Diğer istemci açıklaması değerleri hatasız olarak değiştirilebilir, ancak sonuç tanımlanmamıştır.

hizmet veya istemci için, çağrısından Openönce açıklamayı değiştirmeniz önerilir.

Varsayılan Uç Noktaları Kullanma

Kodda veya yapılandırmada hiçbir uç nokta belirtilmezse çalışma zamanı, hizmet tarafından uygulanan her hizmet sözleşmesi için her temel adrese bir varsayılan uç nokta ekleyerek varsayılan uç noktalar sağlar. Temel adres kodda veya yapılandırmada belirtilebilir ve üzerinde çağrıldığında OpenServiceHostvarsayılan uç noktalar eklenir.

Uç noktalar açıkça sağlanmışsa, çağrısından önce Openüzerinde ServiceHost çağrılarak AddDefaultEndpoints varsayılan uç noktalar eklenebilir. Varsayılan uç noktalar, bağlamalar ve davranışlar hakkında daha fazla bilgi için bkz. WCF Hizmetleri için Basitleştirilmiş Yapılandırma ve Basitleştirilmiş Yapılandırma.

Ayrıca bkz.