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'da (WCF) hizmetleri barındırmak için standart ServiceHost API, WCF mimarisinde bir genişletilebilirlik noktasıdır. Kullanıcılar, genellikle hizmeti açmadan önce varsayılan uç noktaları programlı bir şekilde eklemek veya davranışları değiştirmek için ServiceHost öğesini geçersiz kılmak üzere kendi konak sınıflarını OnOpening()'den türetebilir.
Kendi kendine konaklama ortamında, özelleştirilmiş bir ServiceHost oluşturmanız gerekmez çünkü konağın örneğini oluşturan kodu yazar ve ardından örneği oluşturduktan sonra Open() ona çağırırsınız. Bu iki adım arasında istediğiniz her şeyi yapabilirsiniz. Örneğin, yeni bir IServiceBehavior ekleyebilirsiniz.
public static void Main()
{
ServiceHost host = new ServiceHost( typeof( MyService ) );
host.Description.Add( new MyServiceBehavior() );
host.Open();
...
}
Bu yaklaşım yeniden kullanılamaz. Açıklamayı işleyen kod konak programına (bu örnekte Main() işlevi) kodlanır, bu nedenle bu mantığı başka bağlamlarda yeniden kullanmak zordur. Kesinlik temelli kod gerektirmeyen bir IServiceBehavior eklemenin başka yolları da vardır. Bir özniteliği ServiceBehaviorAttribute türetebilir ve bunu hizmet uygulama türünüze yerleştirebilir veya özel bir davranış biçimini yapılandırılabilir hale getirerek yapılandırmayı kullanarak dinamik olarak oluşturabilirsiniz.
Ancak, bu sorunu çözmek için örneğin küçük bir varyasyonu da kullanılabilir. Bir yaklaşım, ServiceBehavior'ı ekleyen kodu Main() öğesinin dışına çıkarıp OnOpening öğesinin özel bir türevindeki ServiceHost yöntemine taşımaktır.
public class DerivedHost : ServiceHost
{
public DerivedHost( Type t, params Uri baseAddresses ) :
base( t, baseAddresses ) {}
public override void OnOpening()
{
this.Description.Add( new MyServiceBehavior() );
}
}
Ardından, Main() içinde şunları kullanabilirsiniz:
public static void Main()
{
ServiceHost host = new DerivedHost( typeof( MyService ) );
host.Open();
...
}
Artık özel mantığı, birçok farklı ana bilgisayar ortamı arasında kolayca yeniden kullanılabilen net bir soyutlamada kapsüllediniz.
Bu özel ServiceHost özelliğin Internet Information Services (IIS) veya Windows İşlem Etkinleştirme Hizmeti (WAS) içinden nasıl kullanılacağı hemen belli değildir. Bu ortamlar, uygulama adına ServiceHost örneğini veren barındırma ortamı olduğundan, kendi kendine konaklama ortamından farklıdır. IIS ve WAS barındırma altyapısı özel ServiceHost türeviniz hakkında hiçbir şey bilmiyor.
ServiceHostFactory, IIS veya WAS içinden özelleştirilmiş ServiceHost erişim sorununu çözmek için tasarlanmıştır. 'den ServiceHost türetilen özel bir konak dinamik olarak yapılandırıldığından ve çeşitli türlerde olabilir, barındırma ortamı hiçbir zaman doğrudan örnek oluşturmaz. Bunun yerine WCF, barındırma ortamı ile hizmetin somut türü arasında bir dolaylılık katmanı sağlamak için bir fabrika deseni kullanır. Aksini söylemediğiniz sürece, ServiceHostFactory'nin bir örneğini döndüren varsayılan uygulamayı kullanır. Ancak @ServiceHost yönergesinde kendi fabrika uygulamanızın CLR türü adını belirterek, türetilmiş ana bilgisayarınızı döndüren kendi fabrikanızı da sağlayabilirsiniz.
Amaç, temel durumlarda kendi fabrikanızı uygulamanızın kolay bir alıştırma olması olmalıdır. Örneğin, türetilmiş bir ServiceHostFactory döndüren özel bir ServiceHost şöyledir:
public class DerivedFactory : ServiceHostFactory
{
public override ServiceHost CreateServiceHost( Type t, Uri[] baseAddresses )
{
return new DerivedHost( t, baseAddresses )
}
}
Bu fabrikayı varsayılan fabrika yerine kullanmak için @ServiceHost yönergesinde aşağıdaki şekilde tür adını belirtin:
<% @ServiceHost Factory="DerivedFactory" Service="MyService" %>
ServiceHost'den geri döndüğünüz CreateServiceHost üzerinde istediğiniz işlemi yapmak için teknik bir sınır olmasa da, fabrika uygulamalarınızı mümkün olduğunca basit tutmanızı öneririz. Çok sayıda özel mantığınız varsa, bu mantığı fabrikanın yerine ana bilgisayarınızın içine koymak, yeniden kullanılabilir olması açısından daha iyidir.
Barındırma API'sinde burada belirtilmesi gereken bir katman daha vardır. WCF'de ayrıca ServiceHostBase ve ServiceHostFactoryBase vardır; bunlardan sırasıyla ServiceHost ve ServiceHostFactory türetilir. Bunlar, meta veri sisteminin büyük bölümlerini kendi özelleştirilmiş oluşturmalarınızla değiştirmeniz gereken daha gelişmiş senaryolar için mevcuttur.