Çalışma Zamanını Davranışlarla Yapılandırma ve Genişletme

Davranışlar, Windows Communication Foundation (WCF) istemci ve hizmet uygulamalarında varsayılan davranışı değiştirmenize ve hizmet yapılandırmasını inceleyip doğrulayan veya çalışma zamanı davranışını değiştiren özel uzantılar eklemenize olanak tanır. Bu konu başlığında davranış arabirimleri, bunların nasıl uygulandığı ve hizmet açıklamasına (hizmet uygulamasında) veya uç noktaya (istemci uygulamasında) program aracılığıyla veya yapılandırma dosyasına nasıl ekleneceği açıklanmaktadır. Sistem tarafından sağlanan davranışları kullanma hakkında daha fazla bilgi için bkz . Hizmet Çalışma Zamanı Davranışını Belirtme ve İstemci Çalışma Zamanı Davranışını Belirtme.

Davranışlar

Davranış türleri, bu nesneler Windows Communication Foundation (WCF) tarafından bir WCF hizmeti veya WCF istemcisi yürüten bir çalışma zamanı oluşturmak için kullanılmadan önce hizmet veya hizmet uç noktası açıklama nesnelerine (sırasıyla hizmette veya istemcide) eklenir. Çalışma zamanı oluşturma işlemi sırasında bu davranışlar çağrıldığında, sözleşme, bağlamalar ve adresler tarafından oluşturulan çalışma zamanını değiştiren çalışma zamanı özelliklerine ve yöntemlerine erişebilirler.

Davranış Yöntemleri

Tüm davranışların bir AddBindingParameters yöntemi, yöntemi ApplyDispatchBehavior , yöntemi Validate ve tek bir özel durumu olan bir ApplyClientBehavior yöntemi vardır: İstemcide yürütülemediği için IServiceBehavior uygulamaz ApplyClientBehavior.

  • AddBindingParameters Çalışma zamanı oluşturulduğunda özel bağlamaların kullanımları için erişebileceği bir koleksiyonda özel nesneleri değiştirmek veya eklemek için yöntemini kullanın. Örneğin, kanalın oluşturulma biçimini etkileyen ancak kanal geliştiricisi tarafından bilinmeyen koruma gereksinimleri bu şekilde belirtilir.

  • Validate Yöntemini kullanarak açıklama ağacını ve ilgili çalışma zamanı nesnesini inceleyerek bazı ölçüt kümelerine uygun olduğundan emin olun.

  • açıklama ağacını ApplyDispatchBehavior incelemek ve hizmet veya istemcideki belirli bir kapsam için çalışma zamanını değiştirmek için ve ApplyClientBehavior yöntemlerini kullanın. Ayrıca uzantı nesneleri de ekleyebilirsiniz.

    Not

    Bu yöntemlerde bir açıklama ağacı sağlansa da, yalnızca inceleme amaçlıdır. Açıklama ağacı değiştirilirse, davranış tanımlanmamış olur.

Değiştirebileceğiniz özelliklere ve uygulayabileceğiniz özelleştirme arabirimlerine hizmet ve istemci çalışma zamanı sınıfları aracılığıyla erişilir. Hizmet türleri ve DispatchOperation sınıflarıdırDispatchRuntime. İstemci türleri ve ClientOperation sınıflarıdırClientRuntime. ClientRuntime ve DispatchRuntime sınıfları, sırasıyla istemci genelinde ve hizmet genelinde çalışma zamanı özelliklerine ve uzantı koleksiyonlarına erişmek için genişletilebilirlik giriş noktalarıdır. Benzer şekilde ClientOperation , ve DispatchOperation sınıfları sırasıyla istemci işlemini ve hizmet işlemi çalışma zamanı özelliklerini ve uzantı koleksiyonlarını kullanıma sunar. Ancak, işlem çalışma zamanı nesnesinden daha geniş kapsamlı çalışma zamanı nesnesine erişebilirsiniz ve gerekirse tam tersi de geçerlidir.

Not

bir istemcinin yürütme davranışını değiştirmek için kullanabileceğiniz çalışma zamanı özellikleri ve uzantı türleri hakkında bir tartışma için bkz . İstemcileri Genişletme. Bir hizmet dağıtıcısının yürütme davranışını değiştirmek için kullanabileceğiniz çalışma zamanı özellikleri ve uzantı türleri hakkında bir tartışma için bkz . Dağıtıcıları Genişletme.

Çoğu WCF kullanıcısı çalışma zamanıyla doğrudan etkileşim kurmaz; bunun yerine, yapılandırma dosyalarındaki sınıflar veya davranışlar üzerinde uç noktalar, sözleşmeler, bağlamalar, adresler ve davranış öznitelikleri gibi temel programlama modeli yapılarını kullanırlar. Bu yapılar, açıklama ağacı tarafından açıklanan bir hizmeti veya istemciyi desteklemek için bir çalışma zamanı oluşturmak için tam belirtim olan açıklama ağacını oluşturur.

WCF'de dört tür davranış vardır:

Özel öznitelikler uygulayarak, uygulama yapılandırma dosyalarını kullanarak veya doğrudan uygun açıklama nesnesinde davranış koleksiyonuna ekleyerek bu davranışları çeşitli açıklama nesnelerine ekleyebilirsiniz. Ancak, veya ChannelFactory<TChannel>üzerinde çağrılmadan ICommunicationObject.Open önce hizmet açıklamasına veya hizmet uç noktası açıklaması nesnesine ServiceHost eklenmesi gerekir.

Davranış Kapsamları

Her biri belirli bir çalışma zamanı erişimi kapsamına karşılık gelen dört davranış türü vardır.

Hizmet Davranışları

uygulayan IServiceBehaviorhizmet davranışları, tüm hizmet çalışma zamanını değiştirdiğiniz birincil mekanizmadır. Bir hizmete hizmet davranışı eklemeye yönelik üç mekanizma vardır.

  1. Hizmet sınıfında bir öznitelik kullanma. bir ServiceHost oluşturulduğunda, ServiceHost uygulama hizmetin türündeki öznitelik kümesini bulmak için yansıma kullanır. Bu özniteliklerden herhangi biri uygulamasıysa IServiceBehavior, üzerindeki ServiceDescriptiondavranış koleksiyonuna eklenir. Bu, bu davranışların hizmet çalışma zamanının oluşturulmasına katılmasını sağlar.

  2. üzerinde davranış koleksiyonuna ServiceDescriptionprogram aracılığıyla davranışı ekleme. Bu, aşağıdaki kod satırlarıyla gerçekleştirilebilir:

    ServiceHost host = new ServiceHost(/* Parameters */);  
    host.Description.Behaviors.Add(/* Service Behavior */);  
    
  3. Yapılandırmayı genişleten bir özel BehaviorExtensionElement uygulama. Bu, uygulama yapılandırma dosyalarından hizmet davranışının kullanılmasını sağlar.

WCF'deki hizmet davranışlarına ServiceBehaviorAttribute örnek olarak özniteliği, ServiceThrottlingBehaviorve ServiceMetadataBehavior davranışı verilebilir.

Sözleşme Davranışları

Arabirimi uygulayan IContractBehavior sözleşme davranışları, hem istemci hem de hizmet çalışma zamanını bir sözleşmeye genişletmek için kullanılır.

Sözleşmeye sözleşme davranışı eklemek için iki mekanizma vardır. İlk mekanizma, sözleşme arabiriminde kullanılacak özel bir öznitelik oluşturmaktır. Bir sözleşme arabirimi veya öğesine ServiceHostChannelFactory<TChannel>geçirildiğinde, WCF arabirimdeki öznitelikleri inceler. Herhangi bir öznitelik uygulamasıysa IContractBehavior, bunlar bu arabirim için oluşturulan davranışlar koleksiyonuna System.ServiceModel.Description.ContractDescription eklenir.

özel sözleşme davranışı özniteliğinde de uygulayabilirsiniz System.ServiceModel.Description.IContractBehaviorAttribute . Bu durumda, davranış aşağıdaki gibi uygulanır:

•Sözleşme arabirimi. Bu durumda, davranış herhangi bir uç noktada bu türdeki tüm sözleşmelere uygulanır ve WCF özelliğin IContractBehaviorAttribute.TargetContract değerini yoksayar.

•Hizmet sınıfı. Bu durumda, davranış yalnızca sözleşmenin özelliğin değeri olan uç noktalara TargetContract uygulanır.

•Geri çağırma sınıfı. Bu durumda, davranış çift yönlü istemcinin uç noktasına uygulanır ve WCF özelliğin TargetContract değerini yoksayar.

İkinci mekanizma, üzerindeki davranış koleksiyonuna ContractDescriptiondavranışı eklemektir.

WCF'deki sözleşme davranışlarına System.ServiceModel.DeliveryRequirementsAttribute örnek olarak özniteliği verilebilir. Daha fazla bilgi ve örnek için başvuru konusuna bakın.

Uç Nokta Davranışları

uygulayan IEndpointBehavioruç nokta davranışları, belirli bir uç nokta için hizmetin veya istemcinin çalışma zamanının tamamını değiştirdiğiniz birincil mekanizmadır.

Hizmete uç nokta davranışları eklemek için iki mekanizma vardır.

  1. davranışı özelliğine Behaviors ekleyin.

  2. Yapılandırmayı genişleten bir özel BehaviorExtensionElement uygulama.

Daha fazla bilgi ve örnek için başvuru konusuna bakın.

İşlem Davranışları

Arabirimi uygulayan IOperationBehavior işlem davranışları, her işlem için hem istemci hem de hizmet çalışma zamanını genişletmek için kullanılır.

bir işleme işlem davranışı eklemek için iki mekanizma vardır. İlk mekanizma, işlemi modelleyen yöntemde kullanılacak özel bir öznitelik oluşturmaktır. bir veya ChannelFactoryöğesine ServiceHost bir işlem eklendiğinde WCF, bu işlem için oluşturulan davranışlar koleksiyonuna OperationDescription tüm IOperationBehavior öznitelikleri ekler.

İkinci mekanizma, davranışı doğrudan bir üzerinde davranış koleksiyonuna eklemektir OperationDescription.

WCF'deki işlem davranışlarına örnek olarak OperationBehaviorAttribute ve verilebilir TransactionFlowAttribute.

Daha fazla bilgi ve örnek için başvuru konusuna bakın.

Davranış Oluşturmak için Yapılandırmayı Kullanma

Hizmet ve uç nokta ile sözleşme davranışları, kodda belirtilecek şekilde veya öznitelikler kullanılarak tasarlanabilir; yalnızca hizmet ve uç nokta davranışları uygulama veya Web yapılandırma dosyaları kullanılarak yapılandırılabilir. Öznitelikleri kullanarak davranışların açığa çıkarılması, geliştiricilerin derleme zamanında çalışma zamanında eklenemeyen, kaldırılamayan veya değiştirilemeyen bir davranış belirtmesine olanak tanır. Bu genellikle bir hizmetin doğru işlemi için her zaman gerekli olan davranışlar için uygundur (örneğin, özniteliğin işlemle ilgili parametreleri System.ServiceModel.ServiceBehaviorAttribute ). Yapılandırmayı kullanarak davranışları ortaya çıkarmak, geliştiricilerin bu davranışların belirtimini ve yapılandırmasını hizmeti dağıtanlara bırakmasına olanak tanır. Bu, isteğe bağlı bileşenler veya hizmete yönelik meta verilerin kullanıma sunulduğu veya bir hizmet için belirli yetkilendirme yapılandırması gibi dağıtıma özgü başka yapılandırmalar olan davranışlar için uygundur.

Not

Ayrıca, yapılandırmayı destekleyen davranışları kullanarak şirket uygulama ilkelerini machine.config yapılandırma dosyasına ekleyebilir ve bu öğeleri kilitleyebilirsiniz. Açıklama ve örnek için bkz . Nasıl yapılır: Kuruluşta Uç Noktaları Kilitleme.

Yapılandırma kullanarak bir davranışı ortaya çıkarmak için bir geliştiricinin BehaviorExtensionElement türetilmiş sınıfını oluşturması ve ardından bu uzantıyı yapılandırmaya kaydetmesi gerekir.

Aşağıdaki kod örneği, bir IEndpointBehavior öğesinin nasıl uygulandığını BehaviorExtensionElementgösterir:

// BehaviorExtensionElement members  
public override Type BehaviorType  
{  
  get { return typeof(EndpointBehaviorMessageInspector); }  
}  
  
protected override object CreateBehavior()  
{  
  return new EndpointBehaviorMessageInspector();  
}  

Yapılandırma sisteminin özel BehaviorExtensionElementyükleyebilmesi için uzantı olarak kaydedilmesi gerekir. Aşağıdaki kod örneği, önceki uç nokta davranışı için yapılandırma dosyasını gösterir:

<configuration>  
  <system.serviceModel>  
    <services>  
      <service
        name="Microsoft.WCF.Documentation.SampleService"  
        behaviorConfiguration="metadataSupport"  
      >  
        <host>  
          <baseAddresses>  
            <add baseAddress="http://localhost:8080/ServiceMetadata" />  
          </baseAddresses>  
        </host>  
        <endpoint  
          address="/SampleService"  
          binding="wsHttpBinding"  
          behaviorConfiguration="withMessageInspector"
          contract="Microsoft.WCF.Documentation.ISampleService"  
        />  
        <endpoint  
           address="mex"  
           binding="mexHttpBinding"  
           contract="IMetadataExchange"  
        />  
      </service>  
    </services>  
    <behaviors>  
      <serviceBehaviors>  
      <behavior name="metadataSupport">  
        <serviceMetadata httpGetEnabled="true" httpGetUrl=""/>  
      </behavior>  
      </serviceBehaviors>  
      <endpointBehaviors>  
        <behavior name="withMessageInspector">  
          <endpointMessageInspector />  
        </behavior>  
      </endpointBehaviors>  
    </behaviors>  
    <extensions>  
      <behaviorExtensions>  
        <add
          name="endpointMessageInspector"  
          type="Microsoft.WCF.Documentation.EndpointBehaviorMessageInspector, HostApplication, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"  
        />  
      </behaviorExtensions>  
    </extensions>  
  </system.serviceModel>  
</configuration>  

Burada Microsoft.WCF.Documentation.EndpointBehaviorMessageInspector davranış uzantısı türüdür ve HostApplication bu sınıfın derlendiği derlemenin adıdır.

Değerlendirme Sırası

System.ServiceModel.ChannelFactory<TChannel> veSystem.ServiceModel.ServiceHost, programlama modeli ve açıklamasından çalışma zamanını oluşturmaktan sorumludur. Daha önce açıklandığı gibi davranışlar hizmet, uç nokta, sözleşme ve işlemdeki bu derleme işlemine katkıda bulunur.

, ServiceHost davranışları aşağıdaki sırayla uygular:

  1. Hizmet

  2. Contract

  3. Uç nokta

  4. İşlem

Herhangi bir davranış koleksiyonu içinde hiçbir sipariş garanti değildir.

, ChannelFactory<TChannel> davranışları aşağıdaki sırayla uygular:

  1. Contract

  2. Uç nokta

  3. İşlem

Herhangi bir davranış koleksiyonunda, yine hiçbir sipariş garanti değildir.

Program Aracılığıyla Davranış Ekleme

'nin System.ServiceModel.Description.ServiceDescription hizmet uygulamasındaki özellikleri, üzerindeki System.ServiceModel.ServiceHostBaseyönteminden CommunicationObject.OnOpening sonra değiştirilmemelidir. ve üzerindeki özellikleri ve AddServiceEndpoint yöntemleri ServiceHostBaseSystem.ServiceModel.ServiceHostgibi ServiceHostBase.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 System.ServiceModel.Description.ServiceEndpoint üzerinde çağrısından OnOpeningSystem.ServiceModel.ChannelFactorysonra değerler değiştirilmemelidir. ChannelFactory.Credentials özelliği, bu noktadan sonra değiştirilirse bir özel durum oluşturur, ancak diğer istemci açıklaması değerleri hatasız değiştirilebilir. Ancak sonuç tanımlanmamıştır.

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

Davranış Öznitelikleri için Devralma Kuralları

Dört davranış türünün tümü, hizmet davranışları ve sözleşme davranışları gibi öznitelikler kullanılarak doldurulabilir. Öznitelikler yönetilen nesneler ve üyeler üzerinde tanımlandığından ve yönetilen nesneler ve üyeler devralmayı desteklediğinden, davranış özniteliklerinin devralma bağlamında nasıl çalıştığını tanımlamak gerekir.

Yüksek düzeyde kural, belirli bir kapsam (örneğin, hizmet, sözleşme veya işlem) için söz konusu kapsamın devralma hiyerarşisindeki tüm davranış özniteliklerinin uygulanmasıdır. Aynı türde iki davranış özniteliği varsa, yalnızca en çok türetilen tür kullanılır.

Hizmet Davranışları

Belirli bir hizmet sınıfı için, bu sınıftaki ve bu sınıfın ana öğelerindeki tüm hizmet davranışı öznitelikleri uygulanır. Devralma hiyerarşisinde birden çok yere aynı öznitelik türü uygulanırsa, en çok türetilen tür kullanılır.

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]  
[AspNetCompatibilityRequirementsAttribute(  
    AspNetCompatibilityRequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]  
public class A { /* … */ }  
  
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]  
public class B : A { /* … */}  

Örneğin, önceki örnekte B hizmeti bir InstanceContextModeSingleAspNetCompatibilityRequirementsMode , modu Allowedve ConcurrencyMode bir ile sona erer.Single ConcurrencyMode, Singleçünkü ServiceBehaviorAttribute B hizmetindeki öznitelik, A hizmetindekinden "daha fazla türetilmiş" durumdadır.

Sözleşme Davranışları

Belirli bir sözleşme için, bu arabirimdeki ve bu arabirimin ana öğelerindeki tüm sözleşme davranışı öznitelikleri uygulanır. Devralma hiyerarşisinde birden çok yere aynı öznitelik türü uygulanırsa, en çok türetilen tür kullanılır.

İşlem Davranışları

Belirli bir işlem varolan bir soyut veya sanal işlemi geçersiz kılmazsa, devralma kuralları uygulanmaz.

Bir işlem var olan bir işlemi geçersiz kılarsa, bu işlemdeki ve bu işlemin ana öğelerinde tüm işlem davranışı öznitelikleri uygulanır. Devralma hiyerarşisinde birden çok yere aynı öznitelik türü uygulanırsa, en çok türetilen tür kullanılır.