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), WCF uygulamalarının ASP.NET Web hizmetleri gibi programlanıp yapılandırılmasını ve davranışlarını taklit etmelerini sağlayan ASP.NET uyumluluk modu seçeneğine sahiptir. Aşağıdaki bölümlerde, ASP.NET Web hizmetleri ve WCF, her iki teknolojiyi kullanarak uygulama geliştirmek için gerekenlere göre karşılaştırılır.
Veri Gösterimi
ASP.NET içeren bir Web hizmetinin geliştirilmesi genellikle hizmetin kullanmak üzere olduğu karmaşık veri türlerini tanımlamayla başlar. ASP.NET, .NET Framework türleri tarafından temsil edilen verileri bir hizmete veya hizmetten iletim için XML'ye çevirmek ve XML olarak alınan verileri .NET Framework nesnelerine çevirmek için öğesine dayanır XmlSerializer . bir ASP.NET hizmetinin kullanması gereken karmaşık veri türlerini tanımlamak için XML'ye ve XML'den seri hale getirilebilen .NET Framework sınıflarının XmlSerializer tanımı gerekir. Bu tür sınıflar el ile yazılabilir veya xsd.exekomut satırı XML Şemaları/Veri Türleri Destek Yardımcı Programı kullanılarak XML Şemasındaki türlerin tanımlarından oluşturulabilir.
XML'e ve XML'den seri hale getirebileceği .NET Framework sınıflarını XmlSerializer tanımlarken bilinmesi gereken önemli hususların listesi aşağıdadır:
Yalnızca .NET Framework nesnelerinin genel alanları ve özellikleri XML'ye çevrilir.
Koleksiyon sınıflarının örnekleri, yalnızca sınıflar IEnumerable ya da ICollection arabirimini uyguladığında XML olarak seri hale getirilebilir.
IDictionary arabirimini, Hashtable gibi sınıflar uygular ancak XML'e serileştirilemez.
Ad alanında System.Xml.Serialization çok sayıda öznitelik türü bir .NET Framework sınıfına ve üyelerine eklenerek sınıfın örneklerinin XML'de nasıl temsil edilebileceği denetlenebilir.
WCF uygulama geliştirmesi genellikle karmaşık türlerin tanımıyla da başlar. WCF, ASP.NET Web hizmetleriyle aynı .NET Framework türlerini kullanacak şekilde yapılabilir.
WCFDataContractAttribute ve DataMemberAttribute .NET Framework türlerine, türün örneklerinin XML'de seri hale getirileceğini ve aşağıdaki örnek kodda gösterildiği gibi türün belirli alanlarının veya özelliklerinin seri hale getirileceğini belirtmek için eklenebilir.
//Example One:
[DataContract]
public class LineItem
{
[DataMember]
public string ItemNumber;
[DataMember]
public decimal Quantity;
[DataMember]
public decimal UnitPrice;
}
//Example Two:
public class LineItem
{
[DataMember]
private string itemNumber;
[DataMember]
private decimal quantity;
[DataMember]
private decimal unitPrice;
public string ItemNumber
{
get
{
return this.itemNumber;
}
set
{
this.itemNumber = value;
}
}
public decimal Quantity
{
get
{
return this.quantity;
}
set
{
this.quantity = value;
}
}
public decimal UnitPrice
{
get
{
return this.unitPrice;
}
set
{
this.unitPrice = value;
}
}
}
//Example Three:
public class LineItem
{
private string itemNumber;
private decimal quantity;
private decimal unitPrice;
[DataMember]
public string ItemNumber
{
get
{
return this.itemNumber;
}
set
{
this.itemNumber = value;
}
}
[DataMember]
public decimal Quantity
{
get
{
return this.quantity;
}
set
{
this.quantity = value;
}
}
[DataMember]
public decimal UnitPrice
{
get
{
return this.unitPrice;
}
set
{
this.unitPrice = value;
}
}
}
, DataContractAttribute bir türün alanlarının veya özelliklerinin sıfır veya daha fazlasının seri hale getirileceğine işaret ederken DataMemberAttribute , belirli bir alan veya özelliğin seri hale getirileceği anlamına da geliyor. DataContractAttribute bir sınıfa veya yapıya uygulanabilir. DataMemberAttribute bir alana veya özelliğe uygulanabilir ve özniteliğin uygulandığı alanlar ve özellikler genel veya özel olabilir. Bunlara uygulanmış türlerin DataContractAttribute örnekleri WCF'de veri sözleşmeleri olarak adlandırılır. XML, kullanılarak DataContractSerializer olarak serileştirilirler.
Aşağıda, DataContractSerializer ve XmlSerializer kullanımı ile System.Xml.Serialization ad alanının çeşitli özniteliklerinin kullanımındaki önemli farkların listesi bulunmaktadır.
XmlSerializer ad alanının ve öznitelikleriSystem.Xml.Serialization, .NET Framework türlerini XML Şemasında tanımlanan geçerli bir türle eşlemenizi sağlayacak şekilde tasarlanmıştır ve bu nedenle bir türün XML'de nasıl temsil edilir üzerinde çok hassas bir denetim sağlar. DataContractSerializer, DataContractAttribute ve DataMemberAttribute, bir türün XML'de nasıl temsil edildiği üzerinde çok az denetim sağlar. Yalnızca XML'de türü, alanlarını veya özelliklerini temsil etmek için kullanılan ad alanlarını ve adları ve alanların ve özelliklerin XML'de görüntülendiği sırayı belirtebilirsiniz:
[DataContract( Namespace="urn:Contoso:2006:January:29", Name="LineItem")] public class LineItem { [DataMember(Name="ItemNumber",IsRequired=true,Order=0)] public string itemNumber; [DataMember(Name="Quantity",IsRequired=false,Order = 1)] public decimal quantity; [DataMember(Name="Price",IsRequired=false,Order = 2)] public decimal unitPrice; }
.NET türünü temsil etmek için kullanılan XML'nin yapısıyla ilgili her şey, DataContractSerializer tarafından belirlenir.
Bir türün XML'de nasıl temsil edileceği üzerinde çok fazla denetime izin vermeyerek, serileştirme işlemi için DataContractSerializeryüksek oranda tahmin edilebilir hale gelir ve böylece iyileştirmesi daha kolay hale gelir. DataContractSerializer tasarımının pratik bir avantajı, performansı yaklaşık yüzde on oranında daha iyi hale getirmesidir.
Kullanım için XmlSerializer ile ilgili öznitelikler, türün hangi alanlarının veya özelliklerinin XML'e serileştirileceğini göstermezken, DataMemberAttribute, DataContractSerializer ile kullanımda hangi alanların veya özelliklerin açıkça serileştirileceğini belirtir. Bu nedenle, veri sözleşmeleri bir uygulamanın gönderip alması gereken verilerin yapısı hakkında açık sözleşmelerdir.
, XmlSerializer bir .NET nesnesinin genel üyelerini yalnızca XML'ye çevirebilir; DataContractSerializer bu üyelerin erişim değiştiricilerinden bağımsız olarak nesnelerin üyelerini XML'ye çevirebilir.
Türlerin genel olmayan üyelerini XML olarak seri hale getirebilmenin bir sonucu olarak, DataContractSerializer XML'de serileştirebileceği .NET türlerinin çeşitliliği üzerinde daha az kısıtlama vardır. Özellikle Hashtable arabirimini uygulayan IDictionary gibi XML türlerine çevrilebilir. DataContractSerializer, türün tanımını değiştirmek veya bunun için bir sarmalayıcı geliştirmek zorunda kalmadan önceden var olan herhangi bir .NET türünün örneklerini XML olarak seri hale getirebilme olasılığı çok daha yüksektir.
Bir türün DataContractSerializer genel olmayan üyelerine erişebilmenin bir diğer sonucu da tam güven gerektirmesi, ancak XmlSerializer tam güven gerektirmemesidir. Tam Güven kodu erişim izni, kodun yürütülmekte olduğu kimlik bilgileri kullanılarak erişilebilen bir makinedeki tüm kaynaklara tam erişim sağlar. Tam güvenilir kod makinenizdeki tüm kaynaklara eriştiği için bu seçenek dikkatli kullanılmalıdır.
, DataContractSerializer sürüm oluşturma için bazı destek içerir:
DataMemberAttribute, önceki sürümlerde bulunmayan bir IsRequired veri sözleşmesinin yeni sürümlerine eklenen üyeler için false değerine atanabilen bir özelliğe sahiptir ve böylece sözleşmenin daha yeni sürümüne sahip uygulamaların önceki sürümleri işleyebilmesine olanak tanır.
Bir veri sözleşmesi arabirimini IExtensibleDataObject uygulayarak, bir veri sözleşmesinin DataContractSerializer daha yeni sürümlerinde tanımlanan üyelerin sözleşmenin önceki sürümlerine sahip uygulamalar aracılığıyla geçirilmesine izin verebilir.
Tüm farklılıklara rağmen, XML için ad alanı açıkça tanımlandığı sürece, XmlSerializer'nin varsayılan olarak türü serileştirdiği XML, DataContractSerializer'in türü serileştirdiği XML ile anlamsal olarak özdeş olur. Her iki seri hale getiriciyle de kullanılacak öznitelikleri olan aşağıdaki sınıf, hem XmlSerializer hem de DataContractAttribute tarafından anlamsal olarak aynı XML'ye çevrilir.
[Serializable]
[XmlRoot(Namespace="urn:Contoso:2006:January:29")]
[DataContract(Namespace="urn:Contoso:2006:January:29")]
public class LineItem
{
[DataMember]
public string ItemNumber;
[DataMember]
public decimal Quantity;
[DataMember]
public decimal UnitPrice;
}
Windows yazılım geliştirme seti (SDK), ServiceModel Meta Veri Yardımcı Programı Aracı (Svcutil.exe) adlı bir komut satırı aracı içerir. ASP.NET Web hizmetleriyle kullanılan xsd.exe aracı gibi Svcutil.exe xml şemasından .NET veri türlerinin tanımlarını oluşturabilir. Türler, DataContractSerializer tarafından XML Şeması ile tanımlanan biçimde XML yayabiliyorsa veri sözleşmeleridir; aksi takdirde, XmlSerializer kullanılarak serileştirme için tasarlanmıştır. Svcutil.exe, dataContractOnly
anahtarını kullanarak veri sözleşmelerinden bir XML şeması da oluşturabilir.
Uyarı
ASP.NET Web hizmetleri XmlSerializer kullanırken, WCF ASP.NET uyumluluk modu WCF hizmetlerinin ASP.NET Web hizmetlerinin davranışını taklit etmesine neden olurken bile, ASP.NET uyumluluk seçeneği XmlSerializer kullanma zorunluluğu getirmez. ASP.NET uyumluluk modunda çalışan hizmetlerle DataContractSerializer kullanmaya devam edilebilir.
Hizmet Geliştirme
ASP.NET kullanarak bir hizmet geliştirmek için WebService özniteliği bir sınıfa ve WebMethodAttribute bu sınıfın hizmetin işlemleri olacak yöntemlerine eklemek alışılmış bir uygulamadır.
[WebService]
public class Service : T:System.Web.Services.WebService
{
[WebMethod]
public string Echo(string input)
{
return input;
}
}
ASP.NET 2.0, özniteliğini WebService ve WebMethodAttribute sınıfı yerine bir arabirime ekleme ve arabirimi uygulamak için bir sınıf yazma seçeneğini kullanıma sunar:
[WebService]
public interface IEcho
{
[WebMethod]
string Echo(string input);
}
public class Service : IEcho
{
public string Echo(string input)
{
return input;
}
}
Özniteliğine sahip arabirim, aynı sözleşmeyi WebService farklı şekillerde uygulayabilecek çeşitli sınıflarla yeniden kullanılabilen, hizmet tarafından gerçekleştirilen işlemler için bir sözleşme oluşturduğundan, bu seçeneğin kullanılması tercih edilir.
WcF hizmeti, bir veya daha fazla WCF uç noktası tanımlanarak sağlanır. Uç nokta bir adres, bağlama ve hizmet sözleşmesi tarafından tanımlanır. Adres, hizmetin bulunduğu yeri tanımlar. Bağlama, hizmetle nasıl iletişim kuracaklarını belirtir. Hizmet sözleşmesi, hizmetin gerçekleştirebileceği işlemleri tanımlar.
Hizmet sözleşmesi genellikle önce bir arabirime ServiceContractAttribute ve OperationContractAttribute eklenerek tanımlanır.
[ServiceContract]
public interface IEcho
{
[OperationContract]
string Echo(string input);
}
arabiriminin ServiceContractAttribute bir WCF hizmet sözleşmesi tanımladığını belirtir ve OperationContractAttribute varsa arabirim yöntemlerinin hizmet sözleşmesinin işlemlerini tanımladığını belirtir.
Bir hizmet sözleşmesi tanımlandıktan sonra, hizmet sözleşmesinin tanımlandığı arabirimi uygulayan sınıfta hayata geçirilir.
public class Service : IEcho
{
public string Echo(string input)
{
return input;
}
}
Hizmet sözleşmesi uygulayan bir sınıf, WCF'de hizmet türü olarak adlandırılır.
Sonraki adım, bir adresi ve bağlamayı bir hizmet türüyle ilişkilendirmektir. Bu genellikle bir yapılandırma dosyasında, dosyayı doğrudan düzenleyerek veya WCF ile sağlanan bir yapılandırma düzenleyicisi kullanılarak yapılır. Aşağıda bir yapılandırma dosyası örneği verilmiştir.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="Service ">
<endpoint
address="EchoService"
binding="basicHttpBinding"
contract="IEchoService "/>
</service>
</services>
</system.serviceModel>
</configuration>
Bağlama, uygulamayla iletişim kurmak için kullanılan protokol kümesini belirtir. Aşağıdaki tabloda, yaygın seçenekleri temsil eden sistem tarafından sağlanan bağlamalar listelenmiştir.
İsim | Amaç |
---|---|
TemelHttpBinding | WS-BasicProfile 1.1 ve Temel Güvenlik Profili 1.0'ı destekleyen Web hizmetleri ve istemcileriyle birlikte çalışabilirlik. |
WSHttpBinding | HTTP üzerinden WS-* protokollerini destekleyen Web hizmetleri ve istemcilerle birlikte çalışabilirlik. |
WSDualHttpBinding | İlk iletinin alıcısının ilk gönderene doğrudan yanıt vermediği, ancak WS-* protokollerine uygun olarak HTTP kullanarak belirli bir süre boyunca herhangi bir sayıda yanıt iletebileceği çift yönlü HTTP iletişimi. |
WSFederationBinding | Bir hizmetin kaynaklarına erişimin açıkça tanımlanmış bir kimlik bilgisi sağlayıcısı tarafından verilen kimlik bilgilerine göre denetlenebildiği HTTP iletişimi. |
NetTcpBinding | Ağ genelinde WCF yazılım varlıkları arasında güvenli, güvenilir, yüksek performanslı iletişim. |
NetNamedPipeBinding | Aynı makinedeki WCF yazılım varlıkları arasında güvenli, güvenilir, yüksek performanslı iletişim. |
NetMsmqBinding | MSMQ kullanarak WCF yazılım varlıkları arasındaki iletişim. |
MsmqIntegrationBinding | MSMQ kullanarak WCF yazılım varlığı ile başka bir yazılım varlığı arasındaki iletişim. |
NetPeerTcpBinding | Windows Eşler Arası Ağ kullanarak WCF yazılım varlıkları arasındaki iletişim. |
Sistem tarafından sağlanan bağlama, BasicHttpBindingASP.NET Web hizmetleri tarafından desteklenen protokol kümesini içerir.
WCF uygulamaları için özel bağlamalar, WCF'nin tek tek protokolleri uygulamak için kullandığı bağlama öğesi sınıflarının koleksiyonları olarak kolayca tanımlanır. Ek protokolleri temsil etmek için yeni bağlama öğeleri yazılabilir.
Hizmet türlerinin iç davranışı, davranışlar olarak adlandırılan sınıf ailesinin özellikleri kullanılarak ayarlanabilir. Burada, hizmet türünün çok iş parçacıklı olacağını belirtmek için ServiceBehaviorAttribute sınıfı kullanılır.
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple)]
public class DerivativesCalculatorServiceType: IDerivativesCalculator
gibi ServiceBehaviorAttributebazı davranışlar özniteliklerdir. Yöneticilerin ayarlamak istediği özelliklere sahip olan diğerleri, bir uygulamanın yapılandırmasında değiştirilebilir.
Programlama hizmeti türlerinde, OperationContext sınıfı sık sık kullanılır. Statik Current özelliği, bir işlemin çalıştırıldığı bağlamla ilgili bilgilere erişim sağlar. OperationContext, hem HttpContext hem de ContextUtil sınıflarına benzer.
Barındırma
ASP.NET Web hizmetleri bir sınıf kitaplığı derlemesinde derlenir. .asmx uzantısına sahip hizmet dosyası adlı bir dosya sağlanır ve hizmetin kodunu ve bulunduğu derlemeyi içeren sınıfı tanımlayan bir @ WebService
yönerge içerir.
<%@ WebService Language="C#" Class="Service,ServiceAssembly" %>
Hizmet dosyası Internet Information Services'te (IIS) ASP.NET bir uygulama köküne kopyalanır ve derleme bu uygulama kökünün \bin alt dizinine kopyalanır. Daha sonra uygulamaya, uygulama kökündeki hizmet dosyasının tekdüzen kaynak bulucu (URL) kullanılarak erişilebilir.
WCF hizmetleri, IIS 5.1 veya 6.0, IIS 7.0 kapsamında sağlanan Windows İşlem Etkinleştirme Hizmeti (WAS) ve herhangi bir .NET uygulaması içinde kolayca barındırılabilir. IIS 5.1 veya 6.0'da bir hizmeti barındırmak için, hizmetin iletişim aktarım protokolü olarak HTTP kullanması gerekir.
IIS 5.1, 6.0 veya WAS içinde bir hizmeti barındırmak için aşağıdaki adımları kullanın:
Hizmet türünü bir sınıf kütüphanesi derlemesi olarak bütünleyin.
Hizmet türünü tanımlamak için yönergesi olan bir .svc uzantısına sahip bir
@ ServiceHost
hizmet dosyası oluşturun:<%@ServiceHost language="c#" Service="MyService" %>
Hizmet dosyasını bir sanal dizine, derlemeyi ise bu sanal dizinin \bin alt dizinine kopyalayın.
Yapılandırma dosyasını sanal dizine kopyalayın ve Web.configolarak adlandırın.
Daha sonra uygulamaya, uygulama kökündeki hizmet dosyasının URL'si kullanılarak erişilebilir.
Bir .NET uygulaması içinde bir WCF hizmetini barındırmak için, hizmet türünü uygulama tarafından referans alınan bir sınıf kitaplığı derlemesinde derleyin ve ServiceHost sınıfını kullanarak uygulamayı hizmeti barındıracak şekilde programlayın. Aşağıda, gerekli temel programlamanın bir örneği verilmiştir:
string httpBaseAddress = "http://www.contoso.com:8000/";
string tcpBaseAddress = "net.tcp://www.contoso.com:8080/";
Uri httpBaseAddressUri = new Uri(httpBaseAddress);
Uri tcpBaseAddressUri = new Uri(tcpBaseAddress);
Uri[] baseAddresses = new Uri[] {
httpBaseAddressUri,
tcpBaseAddressUri};
using(ServiceHost host = new ServiceHost(
typeof(Service), //"Service" is the name of the service type baseAddresses))
{
host.Open();
[…] //Wait to receive messages
host.Close();
}
Bu örnekte, bir veya daha fazla aktarım protokolünün adreslerinin bir ServiceHostoluşturulmasında nasıl belirtildiği gösterilir. Bu adresler temel adresler olarak adlandırılır.
WCF hizmetinin herhangi bir uç noktası için sağlanan adres, uç noktanın ana bilgisayarının temel adresine göre bir adrestir. Konağın her iletişim aktarım protokolü için bir temel adresi olabilir. Yukarıdaki yapılandırma dosyasındaki örnek yapılandırmada, BasicHttpBinding uç nokta için seçilen aktarım protokolü olarak HTTP kullanır, bu nedenle uç noktanın adresi, EchoService
konağın HTTP temel adresine göredir. Yukarıdaki örnekteki ana bilgisayar söz konusu olduğunda, HTTP temel adresi şeklindedir http://www.contoso.com:8000/
. IIS veya WAS içinde barındırılan bir hizmet için temel adres, hizmetin hizmet dosyasının URL'sidir.
Yalnızca IIS veya WAS'de barındırılan ve yalnızca aktarım protokolü olarak HTTP ile yapılandırılan hizmetler WCF ASP.NET uyumluluk modu seçeneğini kullanacak şekilde yapılabilir. Bu seçeneği açmak için aşağıdaki adımlar gerekir.
Programcının özniteliğini AspNetCompatibilityRequirementsAttribute hizmet türüne eklemesi ve ASP.NET uyumluluk moduna izin verileceğini veya gerekli olduğunu belirtmesi gerekir.
[System.ServiceModel.Activation.AspNetCompatibilityRequirements( RequirementsMode=AspNetCompatibilityRequirementsMode.Require)] public class DerivativesCalculatorServiceType: IDerivativesCalculator
Yöneticinin uygulamayı ASP.NET uyumluluk modunu kullanacak şekilde yapılandırması gerekir.
<configuration> <system.serviceModel> <services> […] </services> <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> </system.serviceModel> </configuration>
WCF uygulamaları, .svc yerine hizmet dosyalarının uzantısı olarak .asmx kullanacak şekilde de yapılandırılabilir.
<system.web> <compilation> <compilation debug="true"> <buildProviders> <remove extension=".asmx"/> <add extension=".asmx" type="System.ServiceModel.ServiceBuildProvider, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> </buildProviders> </compilation> </compilation> </system.web>
Bu seçenek, bir hizmeti WCF kullanacak şekilde değiştirirken .asmx hizmet dosyalarının URL'lerini kullanacak şekilde yapılandırılmış istemcileri değiştirmek zorunda kalmadan sizi kurtarabilir.
Müşteri Geliştirme
ASP.NET Web hizmetleri için istemciler, giriş olarak .asmx dosyasının URL'sini sağlayan WSDL.exekomut satırı aracı kullanılarak oluşturulur. WCF tarafından sağlanan ilgili araç ServiceModel Meta Veri Yardımcı Programı Aracıdır (Svcutil.exe). Hizmet sözleşmesinin tanımına ve WCF istemci sınıfının tanımına sahip bir kod modülü oluşturur. Ayrıca hizmetin adresini ve bağlamasını içeren bir yapılandırma dosyası oluşturur.
Uzak bir hizmetin istemcisini programlarken genellikle zaman uyumsuz bir desene göre programlama önerilir. WSDL.exe aracı tarafından oluşturulan kod her zaman varsayılan olarak hem zaman uyumlu hem de zaman uyumsuz desen sağlar.
ServiceModel Meta Veri Yardımcı Programı Aracı (Svcutil.exe) tarafından oluşturulan kod her iki desen için de sağlayabilir. Varsayılan olarak eşzamanlı deseni destekler. Araç /async
anahtarıyla yürütülürse, oluşturulan kod zaman uyumsuz deseni destekler.
ASP.NET'in WSDL.exe aracı tarafından oluşturulan WCF istemci sınıflarındaki adların varsayılan olarak Svcutil.exe aracı tarafından oluşturulan WCF istemci sınıflarındaki adlarla eşleştiğinin garantisi yoktur. Özellikle, XmlSerializer kullanılarak seri hale getirilmesi gereken sınıfların özellik adlarına, Svcutil.exe aracı tarafından oluşturulan kodda varsayılan olarak Property eki verilirken, WSDL.exe aracında bu durum söz konusu değildir.
İleti Gösterimi
ASP.NET Web hizmetleri tarafından gönderilen ve alınan SOAP iletilerinin üst bilgileri özelleştirilebilir. Bir sınıf, başlığın yapısını tanımlamak için SoapHeader'den türetilir ve ardından SoapHeaderAttribute başlığın varlığını belirtmek için kullanılır.
public class SomeProtocol : SoapHeader
{
public long CurrentValue;
public long Total;
}
[WebService]
public interface IEcho
{
SomeProtocol ProtocolHeader
{
get;
set;
}
[WebMethod]
[SoapHeader("ProtocolHeader")]
string PlaceOrders(PurchaseOrderType order);
}
public class Service: WebService, IEcho
{
private SomeProtocol protocolHeader;
public SomeProtocol ProtocolHeader
{
get
{
return this.protocolHeader;
}
set
{
this.protocolHeader = value;
}
}
string PlaceOrders(PurchaseOrderType order)
{
long currentValue = this.protocolHeader.CurrentValue;
}
}
WCF, MessageContractAttributebir hizmet tarafından gönderilen ve alınan SOAP iletilerinin yapısını açıklamak için , MessageHeaderAttributeve MessageBodyMemberAttribute özniteliklerini sağlar.
[DataContract]
public class SomeProtocol
{
[DataMember]
public long CurrentValue;
[DataMember]
public long Total;
}
[DataContract]
public class Item
{
[DataMember]
public string ItemNumber;
[DataMember]
public decimal Quantity;
[DataMember]
public decimal UnitPrice;
}
[MessageContract]
public class ItemMessage
{
[MessageHeader]
public SomeProtocol ProtocolHeader;
[MessageBody]
public Item Content;
}
[ServiceContract]
public interface IItemService
{
[OperationContract]
public void DeliverItem(ItemMessage itemMessage);
}
Bu söz dizimi, iletilerin yapısının açık bir gösterimini sağlarken, iletilerin yapısı bir ASP.NET Web hizmetinin koduyla gösterilir. Ayrıca, ASP.NET söz diziminde, ileti üst bilgileri önceki örnekteki özellik gibi hizmetin özellikleri olarak ProtocolHeader
gösterilirken, WCF söz diziminde bunlar iletilerin özellikleri olarak daha doğru temsil edilir. Ayrıca WCF, uç noktaların yapılandırmasına ileti üst bilgilerinin eklenmesine izin verir.
<service name="Service ">
<endpoint
address="EchoService"
binding="basicHttpBinding"
contract="IEchoService ">
<headers>
<dsig:X509Certificate
xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
...
</dsig:X509Certificate>
</headers>
</endpoint>
</service>
Bu seçenek, bir istemcinin veya hizmetin kodunda alanyapı protokolü üst bilgilerine başvuru yapmamanızı sağlar: uç noktanın yapılandırılma biçimi nedeniyle üst bilgiler iletilere eklenir.
Hizmet Açıklaması
WSDL sorgusuyla bir ASP.NET Web hizmetinin .asmx dosyası için bir HTTP GET isteği verilmesi, ASP.NET hizmeti açıklamak için WSDL oluşturmasına neden olur. İsteğe yanıt olarak WSDL'yi döndürür.
ASP.NET 2.0, bir hizmetin Web Services-Interoperability Kuruluşu'nun Temel Profil 1.1 (WS-I) ile uyumlu olduğunu doğrulamayı ve hizmetin WSDL'sine uyumlu olduğunu belirten bir talep eklemeyi mümkün hale getirdi. Bu, özniteliğinin ConformsTo
ve EmitConformanceClaims
parametreleri WebServiceBindingAttribute kullanılarak yapılır.
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(
ConformsTo = WsiProfiles.BasicProfile1_1,
EmitConformanceClaims=true)]
public interface IEcho
ASP.NET bir hizmet için oluşturduğu WSDL özelleştirilebilir. Özelleştirmeler, WSDL'ye öğe eklemek için türetilmiş sınıfı ServiceDescriptionFormatExtension oluşturularak yapılır.
IIS 51, 6.0 veya WAS içinde barındırılan bir HTTP uç noktası ile WCF hizmetinin .svc dosyası için WSDL sorgusuyla bir HTTP GET isteği vermek, WCF'nin hizmeti açıklamak için WSDL ile yanıt vermesine neden olur. .NET uygulamasında barındırılan bir hizmetin HTTP temel adresine WSDL sorgusuyla bir HTTP GET isteği göndermek, httpGetEnabled true olarak ayarlandıysa aynı etkiye sahiptir.
Ancak WCF, bir hizmeti açıklamak için oluşturduğu WSDL ile WS-MetadataExchange isteklerine de yanıt verir. ASP.NET Web hizmetlerinin WS-MetadataExchange istekleri için yerleşik desteği yoktur.
WCF'nin oluşturduğu WSDL kapsamlı bir şekilde özelleştirilebilir. sınıfı, ServiceMetadataBehavior WSDL'yi özelleştirmek için bazı olanaklar sağlar. WCF, WSDL oluşturmak yerine belirli bir URL'de statik bir WSDL dosyası kullanmak üzere de yapılandırılabilir.
<behaviors>
<behavior name="DescriptionBehavior">
<metadataPublishing
enableMetadataExchange="true"
enableGetWsdl="true"
enableHelpPage="true"
metadataLocation=
"http://localhost/DerivativesCalculatorService/Service.WSDL"/>
</behavior>
</behaviors>
Özel Durum İşleme
ASP.NET Web hizmetlerinde, işlenmeyen özel durumlar istemcilere SOAP hataları olarak döndürülür. Ayrıca sınıfın örneklerini açıkça oluşturabilir ve istemciye SoapException iletilen SOAP hatasının içeriği üzerinde daha fazla denetime sahip olabilirsiniz.
WCF hizmetlerinde, gizli bilgilerin özel durumlar aracılığıyla yanlışlıkla kullanıma sunulmasını önlemek için, işlenmeyen özel durumlar istemcilere SOAP hataları olarak döndürülemez. Hata ayıklama amacıyla istemcilere işlenmeyen özel durumların döndürülmesi için bir yapılandırma ayarı sağlanır.
SOAP hatalarını istemcilere döndürmek için, FaultException<TDetail> örneklerini oluşturup veri sözleşmesi türünü genel tür olarak kullanabilirsiniz. Bir işlemin oluşturabileceği hataları belirtmek için işlemlere öznitelikler de ekleyebilirsiniz FaultContractAttribute .
[DataContract]
public class MathFault
{
[DataMember]
public string operation;
[DataMember]
public string problemType;
}
[ServiceContract]
public interface ICalculator
{
[OperationContract]
[FaultContract(typeof(MathFault))]
int Divide(int n1, int n2);
}
Bunun yapılması, hizmet için WSDL'de tanıtılan olası hatalarla sonuçlanır ve istemci programcıların bir işlemden hangi hataların kaynaklanabileceğini tahmin etmelerine ve uygun catch deyimlerini yazmalarına olanak tanır.
try
{
result = client.Divide(value1, value2);
}
catch (FaultException<MathFault> e)
{
Console.WriteLine("FaultException<MathFault>: Math fault while doing "
+ e.Detail.operation
+ ". Problem: "
+ e.Detail.problemType);
}
Durum Yönetimi
bir ASP.NET Web hizmeti uygulamak için kullanılan sınıf öğesinden WebServicetüretilebilir.
public class Service : WebService, IEcho
{
public string Echo(string input)
{
return input;
}
}
Bu durumda sınıf, bir WebService nesneye erişmek için temel sınıfın HttpContext Context özelliğini kullanacak şekilde programlanabilir. HttpContext Nesnesi, Uygulama özelliği kullanılarak uygulama durumu bilgilerini güncelleştirmek ve almak için kullanılabilir ve Session özelliği kullanılarak oturum durumu bilgilerini güncelleştirmek ve almak için kullanılabilir.
ASP.NET, öğesinin Session özelliği HttpContext kullanılarak erişilen oturum durumu bilgilerinin gerçekte nerede depolandığı üzerinde önemli bir denetim sağlar. Tanımlama bilgileri içinde, veritabanında, mevcut sunucunun belleğinde veya atanan sunucunun belleğinde depolanabilir. Seçim, hizmetin yapılandırma dosyasında yapılır.
WCF, durum yönetimi için genişletilebilir nesneler sağlar. Genişletilebilir nesneler, uygulayan IExtensibleObject<T>nesnelerdir. En önemli genişletilebilir nesneler ServiceHostBase ve InstanceContext'dir.
ServiceHostBase
, aynı konaktaki tüm hizmet türlerinin tüm örneklerinin erişebildiği durumu korumanıza olanak tanırken InstanceContext
, hizmet türünün aynı örneği içinde çalışan herhangi bir kod tarafından erişilebilen durumu korumanıza olanak tanır.
Burada, hizmet türü, TradingSystem
aynı WCF istemci örneğinden gelen tüm çağrıların hizmet türünün aynı örneğine yönlendirildiğini belirten bir ServiceBehaviorAttribute öğesine sahiptir.
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class TradingSystem: ITradingService
sınıfı, DealData
hizmet türünün aynı örneğinde çalışan herhangi bir kod tarafından erişilebilen durumu tanımlar.
internal class DealData: IExtension<InstanceContext>
{
public string DealIdentifier = null;
public Trade[] Trades = null;
}
Hizmet sözleşmesinin işlemlerinden birini uygulayan hizmet türünün kodunda, hizmet türünün geçerli örneğinin durumuna bir DealData
durum nesnesi eklenir.
string ITradingService.BeginDeal()
{
string dealIdentifier = Guid.NewGuid().ToString();
DealData state = new DealData(dealIdentifier);
OperationContext.Current.InstanceContext.Extensions.Add(state);
return dealIdentifier;
}
Bu durum nesnesi daha sonra hizmet sözleşmesinin işlemlerinden birini uygulayan kod tarafından alınabilir ve değiştirilebilir.
void ITradingService.AddTrade(Trade trade)
{
DealData dealData = OperationContext.Current.InstanceContext.Extensions.Find<DealData>();
dealData.AddTrade(trade);
}
ASP.NET sınıftaki HttpContext durum bilgilerinin gerçekte nerede depolandığı üzerinde denetim sağlarken, WCF en azından ilk sürümünde genişletilebilir nesnelerin nerede depolandığı üzerinde denetim sağlamaz. Bu, WCF hizmeti için ASP.NET uyumluluk modunu seçmenin en iyi nedenini oluşturur. Yapılandırılabilir durum yönetimi zorunluysa, ASP.NET uyumluluk modunun kullanılması, sınıfın HttpContext olanaklarını tam olarak ASP.NET kullanıldıkları gibi kullanmanıza ve ayrıca sınıfı kullanılarak HttpContext yönetilen durum bilgilerinin depolandığı yeri yapılandırmanıza olanak tanır.
Güvenlik
ASP.NET Web hizmetlerinin güvenliğini sağlama seçenekleri, herhangi bir IIS uygulamasının güvenliğini sağlamaya yönelik seçeneklerdir. WCF uygulamaları yalnızca IIS içinde değil, aynı zamanda herhangi bir .NET yürütülebilir dosyası içinde de barındırılabildiği için, WCF uygulamalarının güvenliğini sağlama seçenekleri IIS'nin olanaklarından bağımsız yapılmalıdır. Ancak ASP.NET Web hizmetleri için sağlanan olanaklar, ASP.NET uyumluluk modunda çalışan WCF hizmetleri için de kullanılabilir.
Güvenlik: Kimlik doğrulaması
IIS, anonim erişimi veya çeşitli kimlik doğrulama modlarını seçebileceğiniz uygulamalara erişimi denetleme olanağı sağlar: Windows Kimlik Doğrulaması, Özet Kimlik Doğrulaması, Temel Kimlik Doğrulaması ve .NET Passport Kimlik Doğrulaması. ASP.NET Web hizmetlerine erişimi denetlemek için Windows Kimlik Doğrulaması seçeneği kullanılabilir. Ancak, WCF uygulamaları IIS içinde barındırıldığında, kimlik doğrulamasının diğer çeşitli seçenekler arasında Windows kimlik doğrulamasını destekleyen WCF tarafından yönetilebilmesi için IIS'nin uygulamaya anonim erişime izin vermek üzere yapılandırılması gerekir. Yerleşik diğer seçenekler arasında kullanıcı adı belirteçleri, X.509 sertifikaları, SAML belirteçleri ve CardSpace kartı bulunur, ancak özel kimlik doğrulama mekanizmaları da tanımlanabilir.
Güvenlik: Sahte Kimlik Kullanımı
ASP.NET, belirli bir kullanıcının kimliğini taklit etmesi amacıyla bir ASP.NET Web hizmetinin çalışmasını veya geçerli istekle sağlanan herhangi bir kullanıcıya ait kimlik bilgilerini taşımasını sağlayan bir kimlik öğesi sunar. Bu öğe, ASP.NET uyumluluk modunda çalışan WCF uygulamalarında kimliğe bürünme yapılandırmak için kullanılabilir.
WCF yapılandırma sistemi, belirli bir kullanıcıyı temsil etmek üzere kendi kimlik öğesini sunar. Ayrıca WCF istemcileri ve hizmetleri kimliğe bürünme için bağımsız olarak yapılandırılabilir. İstemciler, isteklerini iletirken geçerli kullanıcının kimliğine bürünecek şekilde yapılandırılabilir.
<behaviors>
<behavior name="DerivativesCalculatorClientBehavior">
<clientCredentials>
<windows allowedImpersonationLevel="Impersonation"/>
</clientCredentials>
</behavior>
</behaviors>
Hizmet işlemleri, mevcut istekle birlikte sağlanan kullanıcı kimlik bilgilerini benimseyecek şekilde yapılandırılabilir.
[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public void Receive(Message input)
Güvenlik: Erişim Denetim Listelerini kullanarak yetkilendirme
Erişim Denetim Listeleri (ACL'ler), .asmx dosyalarına erişimi kısıtlamak için kullanılabilir. Ancak, WCF .svc dosyalarındaki ACL'ler, ASP.NET uyumluluk modu haricinde yoksayılır.
Güvenlik: Rol Tabanlı Yetkilendirme
IIS Windows Kimlik Doğrulaması seçeneği, kullanıcıların atandığı Windows gruplarını temel alan ASP.NET Web hizmetleri için rol tabanlı yetkilendirmeyi kolaylaştırmak için ASP.NET yapılandırma dili tarafından sağlanan yetkilendirme öğesiyle birlikte kullanılabilir. ASP.NET 2.0 daha genel bir rol tabanlı yetkilendirme mekanizmasını kullanıma sunar: rol sağlayıcıları.
Rol sağlayıcıları, bir kullanıcının atandığı roller hakkında bilgi almak için temel bir arabirim uygulayan sınıflardır, ancak her rol sağlayıcısı bu bilgilerin farklı bir kaynaktan nasıl alındığını bilir. ASP.NET 2.0, bir Microsoft SQL Server veritabanından rol atamalarını alabilen bir rol sağlayıcısı ve Windows Server 2003 Yetkilendirme Yöneticisi'nden rol atamalarını alabilen başka bir rol sağlayıcısı sağlar.
Rol sağlayıcısı mekanizması, WCF uygulaması dahil olmak üzere herhangi bir .NET uygulamasında ASP.NET bağımsız olarak kullanılabilir. Bir WCF uygulaması için aşağıdaki örnek yapılandırma, ASP.NET rol sağlayıcısının ServiceAuthorizationBehavior aracılığıyla seçilebilen bir seçenek olduğunu gösterir.
<system.serviceModel>
<services>
<service name="Service.ResourceAccessServiceType"
behaviorConfiguration="ServiceBehavior">
<endpoint
address="ResourceAccessService"
binding="wsHttpBinding"
contract="Service.IResourceAccessContract"/>
</service>
</services>
<behaviors>
<behavior name="ServiceBehavior">
<serviceAuthorization principalPermissionMode="UseAspNetRoles"/>
</behavior>
</behaviors>
</system.serviceModel>
Güvenlik: Talep Tabanlı Yetkilendirme
WCF'nin en önemli yeniliklerinden biri, taleplere göre korumalı kaynaklara erişim yetkisi vermek için kapsamlı desteğidir. Talepler bir tür, bir hak ve değerden, örneğin bir sürücü lisansından oluşur. Taşıyıcı hakkında bir dizi talepte bulunur ve bunlardan biri de taşıyıcının doğum tarihidir. Bu talebin türü doğum tarihi, talebin değeri ise sürücünün doğum tarihidir. Bir talebin taşıyıcıya sağladığı hak, taşıyıcının talebin değeriyle ne yapabileceğini belirtir. Sürücünün doğum tarihi iddiası söz konusu olduğunda, hak sahibidir: sürücü bu doğum tarihine sahiptir, ancak örneğin onu değiştiremez. Roller bir talep türü olduğundan, talep tabanlı yetkilendirme rol tabanlı yetkilendirmeyi kapsar.
Taleplere dayalı yetkilendirme, bir talep kümesini işlemin erişim gereksinimleriyle karşılaştırarak ve bu karşılaştırmanın sonucuna bağlı olarak işleme erişim vererek veya reddederek gerçekleştirilir. WCF'de, ServiceAuthorizationManager
özelliğine bir değer atayarak, talep tabanlı yetkilendirmeyi çalıştırmak için kullanılacak bir sınıf belirtebilirsiniz.
<behaviors>
<behavior name='ServiceBehavior'>
<serviceAuthorization
serviceAuthorizationManagerType=
'Service.AccessChecker, Service' />
</behavior>
</behaviors>
Talep tabanlı yetkilendirme için kullanılan sınıfların, yalnızca bir metodu geçersiz kılacak şekilde ServiceAuthorizationManager içeren AccessCheck()
'dan türetilmiş olması gerekir. WCF, hizmetin bir işlemi çağrıldığında bu yöntemi çağırır ve özelliğinde kullanıcı için hak taleplerini barındıran bir OperationContext nesne sağlar. WCF, kullanıcının kimlik doğrulaması için sağladığı güvenlik belirtecinden kullanıcı hakkındaki talepleri bir araya getirme işini yapar ve bu da söz konusu işlem için bu taleplerin yeterli olup olmadığını değerlendirme görevini bırakır.
WCF'nin her tür güvenlik belirtecinden gelen talepleri otomatik olarak bir araya getirmesi, taleplere dayalı yetkilendirme kodunu kimlik doğrulama mekanizmasından tamamen bağımsız hale getirdiğinden son derece önemli bir yeniliktir. Buna karşılık, ASP.NET'da ACL'leri veya rolleri kullanarak yetkilendirme, Windows kimlik doğrulamasına yakından bağlıdır.
Güvenlik: Gizlilik
ASP.NET Web hizmetleriyle gönderilen iletilerin gizliliği, IIS içindeki uygulama Güvenli Köprü Metni Aktarım Protokolü'ne (HTTPS) göre yapılandırılarak aktarım düzeyinde sağlanabilir. Aynı işlem IIS içinde barındırılan WCF uygulamaları için de yapılabilir. Ancak, IIS dışında barındırılan WCF uygulamaları da güvenli bir aktarım protokolü kullanacak şekilde yapılandırılabilir. Daha da önemlisi, WCF uygulamaları WS-Security protokolü kullanılarak iletilerin taşınmadan önce güvenliğini sağlamak için de yapılandırılabilir. WS-Security kullanarak iletinin yalnızca gövdesinin güvenliğini sağlamak, iletinin son hedefine ulaşmadan önce aracılar arasında gizli bir şekilde iletilmesini sağlar.
Küreselleşme
ASP.NET yapılandırma dili, tek tek hizmetler için kültürü belirtmenize olanak tanır. WCF, ASP.NET uyumluluk modu dışında bu yapılandırma ayarını desteklemez. ASP.NET uyumluluk modunu kullanmayan bir WCF hizmetini yerelleştirmek için hizmet türünü kültüre özgü derlemeler halinde derleyin ve kültüre özgü her derleme için kültüre özgü ayrı uç noktalara sahip olun.