WCF hizmetleri ve ASP.NET

Bu konuda, Windows Communication Foundation (WCF) hizmetlerinin ASP.NET ile yan yana barındırılması ve ASP.NET uyumluluk modunda barındırılması ele alınmaktadır.

WCF'yi ASP.NET ile yan yana barındırma

Internet Information Services'te (IIS) barındırılan WCF hizmetleri ile bulunabilir. ASPX sayfaları ve ASMX Web hizmetleri tek, ortak bir Uygulama Etki Alanı içindedir. ASP.NET hem WCF hem de ASP.NET HTTP çalışma zamanı için AppDomain yönetimi ve dinamik derleme gibi yaygın altyapı hizmetleri sağlar. WCF için varsayılan yapılandırma, ASP.NET ile yan yanadır.

Screenshot showing WCF Services and ASP .NET: sharing state.

ASP.NET HTTP çalışma zamanı, ASP.NET istekleri işler, ancak bu hizmetler ASP.NET içeriğiyle aynı AppDomain'de barındırılsa bile WCF hizmetlerini hedefleyen isteklerin işlenmesine katılmaz. Bunun yerine, WCF Hizmet Modeli WCF hizmetlerine gönderilen iletileri durdurur ve BUNLARı WCF aktarım/kanal yığını üzerinden yönlendirir.

Yan yana modelin sonuçları aşağıdaki gibidir:

  • ASP.NET ve WCF hizmetleri AppDomain durumunu paylaşabilir. İki çerçeve aynı AppDomain'de birlikte bulunabildiğinden, WCF appdomain durumunu ASP.NET (statik değişkenler, olaylar vb.) ile de paylaşabilir.

  • WCF hizmetleri, barındırma ortamından ve aktarımdan bağımsız olarak tutarlı bir şekilde davranır. ASP.NET HTTP çalışma zamanı, iis/ASP.NET barındırma ortamı ve HTTP iletişimi ile kasıtlı olarak birleştirilmiştir. Buna karşılık WCF, barındırma ortamları (WCF, IIS içinde ve dışında tutarlı bir şekilde davranır) ve aktarım genelinde tutarlı bir şekilde davranacak şekilde tasarlanmıştır (IIS 7.0 ve sonraki sürümlerde barındırılan bir hizmet, bu uç noktalardan bazıları HTTP dışında protokoller kullansa bile, kullanıma açık tüm uç noktalarda tutarlı davranış gösterir).

  • AppDomain içinde, HTTP çalışma zamanı tarafından uygulanan özellikler wcf için değil ASP.NET içeriğe uygulanır. ASP.NET uygulama platformunun HTTP'ye özgü birçok özelliği, ASP.NET içerik içeren bir AppDomain içinde barındırılan WCF Hizmetleri için geçerli değildir. Bu özelliklere örnek olarak şunlar verilebilir:

    • HttpContext: Current her zaman null bir WCF hizmetinin içinden erişildiğindedir. Bunun yerine RequestContext kullanın.

    • Dosya tabanlı yetkilendirme: WCF güvenlik modeli, bir hizmet isteğinin yetkilendirilip yetkilendirilmediğine karar verirken hizmetin .svc dosyasına uygulanan erişim denetimi listesine (ACL) izin vermez.

    • Yapılandırma tabanlı URL Yetkilendirmesi: Benzer şekilde, WCF güvenlik modeli System.Web'in <yetkilendirme yapılandırma öğesinde belirtilen URL tabanlı yetkilendirme> kurallarına uymaz. Bir hizmet ASP.NET'in URL yetkilendirme kuralları tarafından güvenliği sağlanan bir URL alanında bulunuyorsa, WCF istekleri için bu ayarlar yoksayılır.

    • HttpModule genişletilebilirliği: WCF barındırma altyapısı, olay tetiklendiğinde PostAuthenticateRequest WCF isteklerini durdurur ve ASP.NET HTTP işlem hattına işleme döndürmez. İşlem hattının sonraki aşamalarında istekleri kesmek için kodlanmış modüller WCF isteklerini kesmez.

    • ASP.NET kimliğe bürünme: ASP.NET System.Web'in <kimliğe bürünme="true" /> yapılandırma seçeneği kullanılarak kimliğe bürünme özelliğini etkinleştirecek şekilde ayarlanmış olsa bile, WCF istekleri varsayılan olarak her zaman IIS işlem kimliği olarak çalışır.

Bu kısıtlamalar yalnızca IIS uygulamasında barındırılan WCF hizmetleri için geçerlidir. ASP.NET içeriğin davranışı WCF'nin varlığından etkilenmez.

HTTP işlem hattı tarafından geleneksel olarak sağlanan işlevler gerektiren WCF uygulamaları, konak ve aktarımdan bağımsız olan WCF eşdeğerlerini kullanmayı düşünmelidir:

Alternatif olarak, hizmetlerinizi WCF'nin ASP.NET uyumluluk modunda çalıştırmayı da düşünebilirsiniz.

WCF hizmetlerini ASP.NET uyumluluk modunda barındırma

WCF modeli, barındırma ortamları ve taşımalar arasında tutarlı bir şekilde davranacak şekilde tasarlanmış olsa da, genellikle bir uygulamanın bu düzeyde esneklik gerektirmediği senaryolar vardır. WCF'nin ASP.NET uyumluluk modu, IIS dışında barındırma veya HTTP dışındaki protokoller üzerinden iletişim kurma olanağı gerektirmeyen ancak ASP.NET Web uygulaması platformunun tüm özelliklerini kullanan senaryolar için uygundur.

WCF barındırma altyapısının WCF iletilerini kestiği ve HTTP işlem hattı dışına yönlendirdiği varsayılan yan yana yapılandırmadan farklı olarak, ASP.NET Uyumluluk Modu'nda çalışan WCF hizmetleri ASP.NET HTTP isteği yaşam döngüsüne tam olarak katılır. Uyumluluk modunda WCF hizmetleri, ASPX sayfaları ve ASMX Web hizmetleri isteklerinin işlenme şekline benzer şekilde bir IHttpHandler uygulama aracılığıyla HTTP işlem hattını kullanır. Sonuç olarak WCF, aşağıdaki ASP.NET özelliklerine göre ASMX ile aynı şekilde davranır:

  • HttpContext: ASP.NET Uyumluluk Modu'nda çalışan WCF hizmetlerine ve ilişkili durumuna erişebilir Current .

  • Dosya tabanlı yetkilendirme: ASP.NET uyumluluk modunda çalışan WCF hizmetleri, hizmetin .svc dosyasına dosya sistemi erişim denetim listeleri (ACL'ler) eklenerek güvenli olabilir.

  • Yapılandırılabilir URL yetkilendirmesi: WCF hizmeti ASP.NET Uyumluluk Modu'nda çalışırken WCF istekleri için ASP.NET'in URL yetkilendirme kuralları uygulanır.

  • HttpModuleCollection genişletilebilirlik: ASP.NET Uyumluluk Modu'nda çalışan WCF hizmetleri ASP.NET HTTP isteği yaşam döngüsüne tam olarak katıldığından, HTTP işlem hattında yapılandırılan tüm HTTP modülleri, hizmet çağırmadan önce ve sonra WCF isteklerinde çalışabilir.

  • ASP.NET Kimliğe Bürünme: WCF hizmetleri, kimliğine bürünülen ASP.NET iş parçacığının geçerli kimliği kullanılarak çalıştırılır. Bu kimlik, uygulama için ASP.NET kimliğe bürünme etkinleştirildiyse IIS işlem kimliğinden farklı olabilir. ASP.NET kimliğe bürünme ve WCF kimliğe bürünme belirli bir hizmet işlemi için etkinleştirilirse, hizmet uygulaması sonuçta WCF'den alınan kimliği kullanarak çalışır.

WCF'nin ASP.NET uyumluluk modu aşağıdaki yapılandırma aracılığıyla uygulama düzeyinde etkinleştirilir (uygulamanın Web.config dosyasında bulunur):

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>

Bu değer belirtilmezse varsayılan olarak false olur. değeri false , uygulamada çalışan tüm WCF hizmetlerinin ASP.NET Uyumluluk Modu'nda çalışmayacağını gösterir.

ASP.NET Uyumluluk Modu, WCF varsayılanından temel olarak farklı istek işleme semantiğini ifade ettiğinden, tek tek hizmet uygulamaları ASP.NET Uyumluluk Modu'nun etkinleştirildiği bir uygulamanın içinde çalışıp çalışmadıklarını denetleyebilme özelliğine sahiptir. Hizmetler, ASP.NET Uyumluluk Modu'nu destekleyip desteklemediklerini belirtmek için öğesini AspNetCompatibilityRequirementsAttribute kullanabilir. Allowed, bu öznitelik için varsayılan değerdir.

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class CalculatorService : ICalculatorSession
{//Implement calculator service methods.}

Aşağıdaki tabloda, uygulama genelinde uyumluluk modu ayarının tek tek hizmetin belirtilen destek düzeyiyle nasıl etkileşimde olduğu gösterilmektedir:

Uygulama genelinde Uyumluluk Modu ayarı [AspNetCompatibilityRequirementsMode]

Ayar
Gözlemlenen Sonuç
aspNetCompatibilityEnabled = "true" Required Hizmet başarıyla etkinleştirilir.
aspNetCompatibilityEnabled = "true" Allowed Hizmet başarıyla etkinleştirilir.
aspNetCompatibilityEnabled = "true" NotAllowed Hizmet bir ileti aldığında etkinleştirme hatası oluşur.
aspNetCompatibilityEnabled = "false" Required Hizmet bir ileti aldığında etkinleştirme hatası oluşur.
aspNetCompatibilityEnabled = "false" Allowed Hizmet başarıyla etkinleştirilir.
aspNetCompatibilityEnabled = "false" NotAllowed Hizmet başarıyla etkinleştirilir.

Not

IIS 7.0 ve WAS, WCF hizmetlerinin HTTP dışındaki protokoller üzerinden iletişim kurmasına olanak tanır. Ancak, ASP.NET uyumluluk modunu etkinleştirmiş uygulamalarda çalışan WCF hizmetlerinin HTTP dışı uç noktaları kullanıma sunmasına izin verilmez. Böyle bir yapılandırma, hizmet ilk iletisini aldığında bir etkinleştirme özel durumu oluşturur.

WCF hizmetleri için ASP.NET uyumluluk modunu etkinleştirme hakkında daha fazla bilgi için bkz AspNetCompatibilityRequirementsMode . ve ASP.NET Uyumluluk örneği.

Ayrıca bkz.