Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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 EndpointAddressve isteğe bağlı Identitybir koleksiyonu içeren sınıfıyla Headers 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ı) Port: 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 ServiceHost örneğini kendiniz yönetmezsiniz. 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 Bilgi Hizmeti Services-Hosted 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öntemi çağrıldığında (yani barındırma uygulaması hizmeti başlatmaya çalıştığında), sistem, adı "UE.Samples.HelloService" olarak belirtilen bir <hizmet> öğesi arar. <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 bir <başlıklarda> bildirilir. Aşağıda, iki üst bilgiyi ayırt eden bir yapılandırma dosyasında bir hizmetin uç noktalarını belirtmek için kullanılan öğelere bir örnek verilmiştir: "Gold" istemciler için http://tempuri1.org/ ve "Standart" istemciler için http://tempuri2.org/. 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 EndpointReference öğesi içinde bir WS-Addressing wsdl:port (EPR) öğesi olarak temsil edilir. EPR, uç noktanın adresini ve tüm adres özelliklerini içerir.
wsdl:port'nin soap:Address içindeki EPR ile değiştirildiğini aşağıdaki örnekte görebileceğiniz üzere 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 nitelikli yol veya hizmetin temel adresine göre bir yol olabilir. Aşağıdaki kod, EndpointAddress sınıfının bir örneğinin nasıl oluşturulacağını ve servisi barındıran ServiceHost örneğine eklemeyi 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();
}
Uyarı
Hizmet uygulamasındaki ServiceDescription'nin özellikleri, OnOpening üzerindeki ServiceHostBase yönteminden sonra değiştirilmemelidir. Bazı üyeler, örneğin Credentials ve AddServiceEndpoint üzerindeki ServiceHostBase özelliği ve ServiceHost yöntemleri, bu noktadan sonra değiştirilirse bir istisna oluşturur. Diğerleri bunları değiştirmenize izin verir, ancak sonuç tanımlanmamıştır.
Benzer şekilde, istemcide ServiceEndpoint üzerinde OnOpening çağrısından sonra ChannelFactory değerleri 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.
İster hizmet ister istemci için olsun, Open'yi aramadan ö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 Open üzerinde ServiceHost çağrıldığında varsayılan uç noktalar eklenir.
Uç noktalar açıkça sağlanmışsa, AddDefaultEndpoints çağrısını yapmadan önce ServiceHost üzerinden Open çağrılarak varsayılan uç noktalar yine de 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.