Aracılığıyla paylaş


İşlem Biçimlendirici ve İşlem Seçici

QueryStringFormatter örneği, Windows Communication Foundation (WCF) genişletilebilirlik noktalarının, ileti verilerine WCF'nin beklediğinden farklı bir biçimde izin vermek için nasıl kullanılabileceğini gösterir. Varsayılan olarak, WCF biçimlendiricileri yöntem parametrelerinin öğesinin altına eklenmesini soap:body bekler. Örnek, bunun yerine bir HTTP GET sorgu dizesinden parametre verilerini ayrıştıran ve bu verileri kullanarak yöntemleri çağıran özel bir işlem biçimlendiricinin nasıl uygulandığını gösterir.

Örnek, hizmet sözleşmesini uygulayan Başlarken'iICalculator temel alır. İstemciden sunucuya istekler için HTTP GET ve sunucudan istemciye yanıtlar için POX iletileriyle HTTP POST kullanmak üzere İleti Ekleme, Çıkarma, Çarpma ve Bölme'nin nasıl değiştirilebileceğini gösterir.

Bunu yapmak için örnek aşağıdakileri sağlar:

  • QueryStringFormatterIClientMessageFormatter, istemci ve sunucu için sırasıyla ve IDispatchMessageFormatter uygular ve sorgu dizesindeki verileri işler.

  • UriOperationSelector, GET isteğindeki işlem adına göre işlem gönderimi gerçekleştirmek için sunucuda uygulama IDispatchOperationSelector yapar.

  • EnableHttpGetRequestsBehavior uç nokta davranışı (ve buna karşılık gelen yapılandırma), bu da çalışma zamanına gerekli işlem seçicisini ekler.

  • Çalışma zamanına yeni bir işlem biçimlendirici eklemeyi gösterir.

  • Bu örnekte hem istemci hem de hizmet konsol uygulamalarıdır (.exe).

Not

Bu örnek için kurulum yordamı ve derleme yönergeleri bu konunun sonunda yer alır.

Önemli Kavramlar

QueryStringFormatter - İşlem biçimlendirici, WCF'de bir iletiyi parametre nesneleri dizisine ve parametre nesneleri dizisini iletiye dönüştürmekle sorumlu bileşendir. Bu işlem, arabirimi kullanılarak istemcide IClientMessageFormatter ve arabirime sahip IDispatchMessageFormatter sunucuda gerçekleştirilir. Bu arabirimler kullanıcıların ve Deserialize yöntemlerinden Serialize istek ve yanıt iletilerini almasını sağlar.

Bu örnekte, QueryStringFormatter bu arabirimlerin her ikisini de uygular ve istemci ve sunucuda uygulanır.

İstek:

  • Örnek, istek iletisindeki parametre verilerini dizelere ve dizelerden dönüştürmek için sınıfını kullanır TypeConverter . belirli bir TypeConverter tür için kullanılamıyorsa, örnek biçimlendirici bir özel durum oluşturur.

  • İstemcideki IClientMessageFormatter.SerializeRequest yönteminde, biçimlendirici uygun To adresiyle bir URI oluşturur ve işlem adını sonek olarak ekler. Bu ad, sunucuda uygun işleme göndermek için kullanılır. Ardından parametre nesneleri dizisini alır ve parametre adlarını ve sınıfı tarafından dönüştürülen değerleri kullanarak parametre verilerini URI sorgu dizesine TypeConverter serileştirir. Ve ToVia özellikleri daha sonra bu URI'ye ayarlanır. MessageProperties özelliği üzerinden Properties erişilir.

  • Sunucudaki IDispatchMessageFormatter.DeserializeRequest yönteminde, biçimlendirici gelen istek iletisi özelliklerinde URI'yi alır Via . URI sorgu dizesindeki ad-değer çiftlerini parametre adlarına ve değerlerine ayrıştırarak parametre adlarını ve değerlerini kullanarak yönteme geçirilen parametre dizisini doldurur. İşlem gönderiminin zaten oluştuğuna dikkat edin, bu nedenle işlem adı soneki bu yöntemde yoksayılır.

Yanıt:

  • Bu örnekte HTTP GET yalnızca istek için kullanılır. Biçimlendirici, yanıtın bir XML iletisi oluşturmak için kullanılacak özgün biçimlendiriciye gönderilmesini temsil eder. Bu örneğin hedeflerinden biri, bu tür bir temsilci seçme biçimlendiricisinin nasıl uygulanabileceğini göstermektir.

UriPathSuffixOperationSelector Sınıfı

Arabirim, IDispatchOperationSelector kullanıcıların belirli bir iletinin gönderilmesi gereken kendi mantığını uygulamasına olanak tanır.

bu örnekte, UriPathSuffixOperationSelector işlem adı iletideki bir eylem üst bilgisi yerine HTTP GET URI'sine eklendiğinden, uygun işlemi seçmek için sunucuda uygulanmalıdır. Örnek, yalnızca büyük/küçük harfe duyarsız işlem adlarına izin verecek şekilde ayarlanır.

SelectOperation yöntemi gelen iletiyi alır ve ileti özelliklerinde URI'yi ararVia. URI'den işlem adı sonekini ayıklar, iletinin gönderilmesi gereken işlem adını almak için bir iç tablo arar ve bu işlem adını döndürür.

EnableHttpGetRequestsBehavior Sınıfı

Bileşen UriPathSuffixOperationSelector program aracılığıyla veya bir uç nokta davranışı aracılığıyla ayarlanabilir. Örnek, hizmetin uygulama yapılandırma dosyasında belirtilen davranışı uygular EnableHttpGetRequestsBehavior .

Sunucuda:

OperationSelector uygulamasına IDispatchOperationSelector ayarlanır.

WcF varsayılan olarak tam eşleşme adres filtresi kullanır. Gelen iletideki URI, parametre verilerini içeren bir işlem adı soneki ve ardından bir sorgu dizesi içerdiğinden, uç nokta davranışı adres filtresini de ön ek eşleştirme filtresi olarak değiştirir. Bu amaçla WCFPrefixEndpointAddressMessageFilter kullanır.

İşlem biçimlendiricilerini yükleme

Biçimlendiricileri belirten işlem davranışları benzersizdir. Gerekli işlem biçimlendiricisini oluşturmak için her işlem için bu tür bir davranış her zaman varsayılan olarak uygulanır. Ancak, bu davranışlar başka bir işlem davranışı gibi görünür; diğer öznitelikler tarafından tanımlanamaz. Değiştirme davranışını yüklemek için uygulamanın, WCF türü yükleyicisi tarafından varsayılan olarak yüklenen belirli biçimlendirici davranışlarını araması ve bunu değiştirmesi veya varsayılan davranıştan sonra çalışacak uyumlu bir davranış eklemesi gerekir.

Bu işlem biçimlendirici davranışları, çağrıdan CommunicationObject.Open önce veya varsayılan işlemden sonra yürütülen bir işlem davranışı belirtilerek program aracılığıyla ayarlanabilir. Ancak, davranış modeli bir davranışın diğer davranışları değiştirmesine veya açıklama ağacını başka bir şekilde değiştirmesine izin vermediğinden, bir uç nokta davranışı (ve dolayısıyla yapılandırma) tarafından kolayca ayarlanamaz.

İstemcide:

Uygulamanın IClientMessageFormatter , istekleri HTTP GET isteklerine dönüştürebilmesi ve yanıtlar için özgün biçimlendiriciye temsilci seçebilmesi için uygulanması gerekir. Bu, yardımcı yöntemi çağrılarak EnableHttpGetRequestsBehavior.ReplaceFormatterBehavior yapılır.

Bu işlem çağrılmadan CreateChannelönce yapılmalıdır.

void ReplaceFormatterBehavior(OperationDescription operationDescription, EndpointAddress address)
{
    // Remove the DataContract behavior if it is present.
    IOperationBehavior formatterBehavior = operationDescription.Behaviors.Remove<DataContractSerializerOperationBehavior>();
    if (formatterBehavior == null)
    {
        // Remove the XmlSerializer behavior if it is present.
        formatterBehavior = operationDescription.Behaviors.Remove<XmlSerializerOperationBehavior>();
        ...
    }

    // Remember what the innerFormatterBehavior was.
    DelegatingFormatterBehavior delegatingFormatterBehavior = new DelegatingFormatterBehavior(address);
    delegatingFormatterBehavior.InnerFormatterBehavior = formatterBehavior;
   operationDescription.Behaviors.Add(delegatingFormatterBehavior);
}

Sunucuda:

  • Http IDispatchMessageFormatter GET isteklerini okuyabilmesi ve yanıtları yazmak için özgün biçimlendiriciye temsilci seçebilmesi için arabirim uygulanmalıdır. Bu, istemciyle aynı EnableHttpGetRequestsBehavior.ReplaceFormatterBehavior yardımcı yöntemi çağırarak yapılır (önceki kod örneğine bakın).

  • Bu işlem çağrılmadan önce Open yapılmalıdır. Bu örnekte, çağıramadan Openönce biçimlendiricinin el ile nasıl değiştirildiği gösterilmektedir. Aynı şeyi elde etmenin başka bir yolu, açmadan ServiceHost önce çağrısı EnableHttpGetRequestsBehavior.ReplaceFormatterBehavior yapan bir sınıf türetmektir (örnekler için lütfen barındırma belgelerine ve örneklerine bakın).

Kullanıcı deneyimi

Sunucuda:

  • Sunucu ICalculator uygulamasının değiştirilmesi gerekmez.

  • Hizmet için App.config öğesinin özniteliğini olarak ayarlayan messageVersion özel bir POX bağlaması textMessageEncodingNonekullanmalıdır.

    <bindings>
      <customBinding>
        <binding name="poxBinding">
          <textMessageEncoding messageVersion="None" />
          <httpTransport />
        </binding>
      </customBinding>
    </bindings>
    
  • Hizmetin App.config'i de davranış uzantıları bölümüne ekleyerek ve kullanarak özel EnableHttpGetRequestsBehavior değerini belirtmesi gerekir.

    <behaviors>
      <endpointBehaviors>
        <behavior name="enableHttpGetRequestsBehavior">
          <enableHttpGetRequests />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    
    <extensions>
      <behaviorExtensions>
        <!-- Enabling HTTP GET requests: Behavior Extension -->
        <add
          name="enableHttpGetRequests"           type="Microsoft.ServiceModel.Samples.EnableHttpGetRequestsBehaviorElement, QueryStringFormatter, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
      </behaviorExtensions>
    </extensions>
    
  • çağırmadan Openönce işlem biçimlendiricileri ekleyin.

İstemcide:

  • İstemci uygulamasının değişmesi gerekmez.

  • İstemci için App.config öğesinin özniteliğini olarak ayarlayan messageVersion özel bir POX bağlaması textMessageEncodingNonekullanmalıdır. Hizmetten bir fark, giden adresin değiştirilebilmesi için istemcinin el ile adreslemesi etkinleştirmesi gerektiğidir.

    <bindings>
      <customBinding>
        <binding name="poxBinding">
          <textMessageEncoding messageVersion="None" />
          <httpTransport manualAddressing="True" />
        </binding>
      </customBinding>
    </bindings>
    
  • İstemci için App.config, sunucuyla aynı özel EnableHttpGetRequestsBehavior değeri belirtmelidir.

  • çağırmadan CreateChannel()önce işlem biçimlendiricileri ekleyin.

Örneği çalıştırdığınızda, işlem istekleri ve yanıtları istemci konsolu penceresinde görüntülenir. Dört işlemin de (Ekle, Çıkar, Çarp ve Böl) başarılı olması gerekir.

Örneği ayarlamak, derlemek ve çalıştırmak için
  1. Windows Communication Foundation Örnekleri için Tek Seferlik Kurulum Yordamı'nı gerçekleştirdiğinizden emin olun.

  2. Çözümü oluşturmak için Windows Communication Foundation Örnekleri Oluşturma başlığındaki yönergeleri izleyin.

  3. Örneği tek veya makineler arası bir yapılandırmada çalıştırmak için Windows Communication Foundation Örneklerini Çalıştırma başlığındaki yönergeleri izleyin.