Yönlendirme Tanıtımı

Yönlendirme Hizmeti, iletileri ileti içeriğine göre yönlendirebilen genel bir takılabilir SOAP aracı sağlar. Yönlendirme Hizmeti ile, hizmet toplama, hizmet sürümü oluşturma, öncelik yönlendirme ve çok noktaya yayın yönlendirme gibi senaryoları uygulamanıza olanak tanıyan karmaşık yönlendirme mantığı oluşturabilirsiniz. Yönlendirme Hizmeti, birincil hedef uç noktaya gönderirken bir hata oluştuğunda iletilerin gönderileceği yedekleme uç noktalarının listesini ayarlamanıza olanak tanıyan hata işleme de sağlar.

Bu konu, Yönlendirme Hizmeti'ne yeni başlayanlar için tasarlanmıştır ve Yönlendirme Hizmeti'nin temel yapılandırmasını ve barındırmasını kapsar.

Yapılandırma

Yönlendirme Hizmeti, istemci uygulamalarından ileti alan ve iletileri bir veya daha fazla hedef uç noktaya yönlendiren bir veya daha fazla hizmet uç noktasını kullanıma sunan bir WCF hizmeti olarak uygulanır. Hizmet, hizmet tarafından kullanıma sunulan hizmet uç noktalarına uygulanan bir RoutingBehaviorsağlar. Bu davranış, hizmetin nasıl çalıştığının çeşitli yönlerini yapılandırmak için kullanılır. Yapılandırma dosyası kullanırken yapılandırma kolaylığı için parametreler RoutingBehavior'da belirtilir. Kod tabanlı senaryolarda, bu parametreler bir RoutingConfiguration nesnenin parçası olarak belirtilebilir ve daha sonra bir RoutingBehavior'a geçirilebilir.

Bu davranış başlatılırken, iletilerin SoapProcessingBehaviorSOAP işlemini gerçekleştirmek için kullanılan öğesini istemci uç noktalarına ekler. Bu, Yönlendirme Hizmeti'nin iletileri iletinin alındığı uç noktadan farklı bir MessageVersion gerektiren uç noktalara iletmesine olanak tanır. RoutingBehavior ayrıca, RoutingExtensionçalışma zamanında Yönlendirme Hizmeti yapılandırmasını değiştirmek için bir erişilebilirlik noktası sağlayan bir hizmet uzantısı kaydeder.

RoutingConfiguration sınıfı, Yönlendirme Hizmeti yapılandırmasını yapılandırmak ve güncelleştirmek için tutarlı bir araç sağlar. Yönlendirme Hizmeti'nin ayarları olarak davranan parametreler içerir ve hizmet başlatıldığında RoutingBehavior'ı yapılandırmak için kullanılır veya çalışma zamanında yönlendirme yapılandırmasını değiştirmek için RoutingExtension'a geçirilir.

İletilerin içerik tabanlı yönlendirmesini gerçekleştirmek için kullanılan yönlendirme mantığı, birden çok MessageFilter nesneyi filtre tablolarında (MessageFilterTable<TFilterData> nesneler) gruplandırarak tanımlanır. Gelen iletiler, filtre tablosunda yer alan ileti filtrelerine göre değerlendirilir ve iletiyle eşleşen her MessageFilter için hedef uç noktaya iletilir. İletileri yönlendirmek için kullanılması gereken filtre tablosu, yapılandırmada RoutingBehavior kullanılarak veya RoutingConfiguration nesnesi kullanılarak kod aracılığıyla belirtilir.

Uç Noktaları Tanımlama

Kullanacağınız yönlendirme mantığını tanımlayarak yapılandırmanızı başlatmanız gerekebilir ancak ilk adımınız aslında iletileri yönlendirecek olduğunuz uç noktaların şeklini belirlemek olmalıdır. Yönlendirme Hizmeti, iletileri almak ve göndermek için kullanılan kanalların şeklini tanımlayan sözleşmeleri kullanır ve bu nedenle giriş kanalının şeklinin çıkış kanalıyla eşleşmesi gerekir. Örneğin, istek-yanıt kanalı şeklini kullanan uç noktalara yönlendiriyorsanız, gelen uç noktalarda uyumlu bir sözleşme kullanmanız gerekir; örneğin IRequestReplyRouter.

Bu, hedef uç noktalarınız birden çok iletişim desenine (tek yönlü ve iki yönlü işlemleri karıştırma gibi) sahip sözleşmeler kullanıyorsa, iletileri alıp tümüne yönlendirebilen tek bir hizmet uç noktası oluşturamayacağınız anlamına gelir. Hangi uç noktaların uyumlu şekillere sahip olduğunu belirlemeniz ve hedef uç noktalara yönlendirilecek iletileri almak için kullanılacak bir veya daha fazla hizmet uç noktası tanımlamanız gerekir.

Not

Birden çok iletişim deseni (tek yönlü ve iki yönlü işlemlerin karışımı gibi) belirten sözleşmelerle çalışırken geçici çözüm, Yönlendirme Hizmeti'nde gibi IDuplexSessionRouterbir çift yönlü sözleşme kullanmaktır. Ancak bu, bağlamanın çift yönlü iletişim yeteneğine sahip olması gerektiği anlamına gelir ve bu durum tüm senaryolar için mümkün olmayabilir. Bunun mümkün olmadığı senaryolarda, iletişimi birden çok uç noktaya hesaba katarak veya uygulamayı değiştirmek gerekebilir.

Yönlendirme sözleşmeleri hakkında daha fazla bilgi için bkz . Yönlendirme Sözleşmeleri.

Hizmet uç noktası tanımlandıktan sonra, belirli bir RoutingConfiguration'ı uç noktayla ilişkilendirmek için RoutingBehavior'ı kullanabilirsiniz. Yönlendirme Hizmeti'ni yapılandırma dosyası kullanarak yapılandırırken RoutingBehavior, bu uç noktada alınan iletileri işlemek için kullanılan yönlendirme mantığını içeren filtre tablosunu belirtmek için kullanılır. Yönlendirme Hizmeti'ni program aracılığıyla yapılandırıyorsanız, RoutingConfiguration kullanarak filtre tablosunu belirtebilirsiniz.

Aşağıdaki örnek, Yönlendirme Hizmeti tarafından hem program aracılığıyla hem de yapılandırma dosyası kullanılarak kullanılan hizmet ve istemci uç noktalarını tanımlar.

<services>
  <!--ROUTING SERVICE -->
  <service behaviorConfiguration="routingData"
            name="System.ServiceModel.Routing.RoutingService">
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8000/routingservice/router"/>
      </baseAddresses>
    </host>
    <!-- Define the service endpoints that are receive messages -->
    <endpoint address=""
              binding="wsHttpBinding"
              name="reqReplyEndpoint"
              contract="System.ServiceModel.Routing.IRequestReplyRouter" />
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="routingData">
      <serviceMetadata httpGetEnabled="True"/>
      <!-- Add the RoutingBehavior and specify the Routing Table to use -->
      <routing filterTableName="routingTable1" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<client>
<!-- Define the client endpoint(s) to route messages to -->
  <endpoint name="CalculatorService"
            address="http://localhost:8000/servicemodelsamples/service"
            binding="wsHttpBinding" contract="*" />
</client>
//set up some communication defaults
string clientAddress = "http://localhost:8000/servicemodelsamples/service";
string routerAddress = "http://localhost:8000/routingservice/router";
Binding routerBinding = new WSHttpBinding();
Binding clientBinding = new WSHttpBinding();
//add the endpoint the router uses to receive messages
serviceHost.AddServiceEndpoint(
     typeof(IRequestReplyRouter),
     routerBinding,
     routerAddress);
//create the client endpoint the router routes messages to
ContractDescription contract = ContractDescription.GetContract(
     typeof(IRequestReplyRouter));
ServiceEndpoint client = new ServiceEndpoint(
     contract,
     clientBinding,
     new EndpointAddress(clientAddress));
//create a new routing configuration object
RoutingConfiguration rc = new RoutingConfiguration();
….
rc.FilterTable.Add(new MatchAllMessageFilter(), endpointList);
//attach the behavior to the service host
serviceHost.Description.Behaviors.Add(
     new RoutingBehavior(rc));

Bu örnekte Yönlendirme Hizmeti, yönlendirilecek iletileri almak için kullanılan adresine http://localhost:8000/routingservice/routersahip tek bir uç noktayı kullanıma sunulacak şekilde yapılandırılır. İletiler istek-yanıt uç noktalarına yönlendirildiğinden, hizmet uç noktası sözleşmeyi IRequestReplyRouter kullanır. Bu yapılandırma, iletilerin http://localhost:8000/servicemodelsample/service yönlendirildiğini tek bir istemci uç noktasını da tanımlar. "routingTable1" adlı filtre tablosu (gösterilmez) iletileri yönlendirmek için kullanılan yönlendirme mantığını içerir ve RoutingBehavior (yapılandırma dosyası için) veya RoutingConfiguration (programlı yapılandırma için) kullanılarak hizmet uç noktasıyla ilişkilendirilir.

Yönlendirme Mantığı

İletileri yönlendirmek için kullanılan yönlendirme mantığını tanımlamak için, gelen iletilerde bulunan verilerin benzersiz olarak gerçekleştirilebileceğini belirlemeniz gerekir. Örneğin, yönlendirdiğiniz tüm hedef uç noktalar aynı SOAP Eylemlerini paylaşmak için yönlendiriliyorsa, iletinin içinde yer alan Eylemin değeri, iletinin hangi belirli uç noktaya yönlendirileceğine ilişkin iyi bir gösterge değildir. İletileri benzersiz bir şekilde belirli bir uç noktaya yönlendirmeniz gerekiyorsa, iletinin yönlendirildiğini hedef uç noktayı benzersiz olarak tanımlayan verilere göre filtrelemeniz gerekir.

Yönlendirme Hizmeti, iletideki adres, eylem, uç nokta adı ve hatta XPath sorgusu gibi belirli değerleri inceleyen birkaç MessageFilter uygulaması sağlar. Bu uygulamalardan hiçbiri gereksinimlerinizi karşılamıyorsa özel bir MessageFilter uygulaması oluşturabilirsiniz. İleti filtreleri ve Yönlendirme Hizmeti tarafından kullanılan uygulamaların karşılaştırması hakkında daha fazla bilgi için bkz . İleti Filtreleri ve Filtre Seçme.

Birden çok ileti filtresi, her MessageFilter'ı bir hedef uç noktayla ilişkilendiren filtre tablolarında birlikte düzenlenir. İsteğe bağlı olarak, filtre tablosu, bir iletim hatası durumunda Yönlendirme Hizmeti'nin iletiyi göndermeye çalışacağı yedekleme uç noktalarının listesini belirtmek için de kullanılabilir.

Varsayılan olarak, filtre tablosundaki tüm ileti filtreleri aynı anda değerlendirilir; ancak, ileti filtrelerinin belirli bir Priority sırada değerlendirilmesine neden olan bir belirtebilirsiniz. En yüksek önceliğe sahip tüm girişler önce değerlendirilir ve daha düşük öncelikli ileti filtreleri, bir eşleşme daha yüksek öncelik düzeyinde bulunursa değerlendirilmez. Filtre tabloları hakkında daha fazla bilgi için bkz . İleti Filtreleri.

Aşağıdaki örneklerde MatchAllMessageFilter, tüm iletiler için olarak değerlendirilen true kullanılır. Bu MessageFilter, MessageFilter'ı "CalculatorService" adlı istemci uç noktasıyla ilişkilendiren "routingTable1" filtre tablosuna eklenir. RoutingBehavior daha sonra bu tablonun hizmet uç noktası tarafından işlenen iletileri yönlendirmek için kullanılması gerektiğini belirtir.

<behaviors>
  <serviceBehaviors>
    <behavior name="routingData">
      <serviceMetadata httpGetEnabled="True"/>
      <!-- Add the RoutingBehavior and specify the Routing Table to use -->
      <routing filterTableName="routingTable1" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<!--ROUTING SECTION -->
<routing>
  <filters>
    <filter name="MatchAllFilter1" filterType="MatchAll" />
  </filters>
  <filterTables>
    <table name="routingTable1">
      <filters>
        <add filterName="MatchAllFilter1" endpointName="CalculatorService" />
      </filters>
    </table>
  </filterTables>
</routing>
//create a new routing configuration object
RoutingConfiguration rc = new RoutingConfiguration();
//create the endpoint list that contains the endpoints to route to
//in this case we have only one
List<ServiceEndpoint> endpointList = new List<ServiceEndpoint>();
endpointList.Add(client);
//add a MatchAll filter to the Router's filter table
//map it to the endpoint list defined earlier
//when a message matches this filter, it is sent to the endpoint contained in the list
rc.FilterTable.Add(new MatchAllMessageFilter(), endpointList);

Not

Varsayılan olarak, Yönlendirme Hizmeti yalnızca iletinin üst bilgilerini değerlendirir. Filtrelerin ileti gövdesine erişmesine izin vermek için olarak ayarlamanız RouteOnHeadersOnlyfalsegerekir.

Çok noktaya yayın

Birçok Yönlendirme Hizmeti yapılandırması, iletileri yalnızca belirli bir uç noktaya yönlendiren özel filtre mantığı kullansa da, belirli bir iletiyi birden çok hedef uç noktaya yönlendirmeniz gerekebilir. Bir iletiyi birden çok hedefe çok noktaya yayın yapmak için aşağıdaki koşulların doğru olması gerekir:

  • İstek yanıtında istemci uygulaması tarafından yalnızca bir yanıt alınabildiğinden kanal şekli istek-yanıt (tek yönlü veya çift yönlü olabilir) olmamalıdır.

  • İleti değerlendirilirken birden çok filtre döndürülmelidir true .

Bu koşullar karşılanırsa, ileti olarak değerlendirilen tüm filtrelerin tüm uç noktalarına trueyönlendirilir. Aşağıdaki örnek, iletideki uç nokta adresi ise iletilerin her iki uç noktaya da yönlendirilmesine neden olan http://localhost:8000/routingservice/router/roundingbir yönlendirme yapılandırmasını tanımlar.

<!--ROUTING SECTION -->
<routing>
  <filters>
    <filter name="MatchAllFilter1" filterType="MatchAll" />
    <filter name="RoundingFilter1" filterType="EndpointAddress"
            filterData="http://localhost:8000/routingservice/router/rounding" />
  </filters>
  <filterTables>
    <table name="routingTable1">
      <filters>
        <add filterName="MatchAllFilter1" endpointName="CalculatorService" />
        <add filterName="RoundingFilter1" endpointName="RoundingCalcService" />
      </filters>
    </table>
  </filterTables>
</routing>
rc.FilterTable.Add(new MatchAllMessageFilter(), calculatorEndpointList);
rc.FilterTable.Add(new EndpointAddressMessageFilter(new EndpointAddress(
    "http://localhost:8000/routingservice/router/rounding")),
    roundingCalcEndpointList);

SOAP İşleme

İletilerin farklı protokoller arasında yönlendirilmesine destek olmak için RoutingBehavior varsayılan olarak iletilerin SoapProcessingBehavior yönlendirdiği tüm istemci uç noktalarına öğesini ekler. Bu davranış, iletiyi uç noktaya yönlendirmeden önce otomatik olarak yeni bir MessageVersion oluşturur ve istekte bulunan istemci uygulamasına döndürmeden önce herhangi bir yanıt belgesi için uyumlu bir MessageVersion oluşturur.

Giden ileti için yeni bir MessageVersion oluşturma adımları aşağıdaki gibidir:

İstek işleme

  • Giden bağlamanın /kanalın MessageVersion'ını alın.

  • Özgün ileti için gövde okuyucuyu alın.

  • Aynı eylem, gövde okuyucu ve yeni bir MessageVersion ile yeni bir ileti oluşturun.

  • != Addressing.None ise Addressing , Yeni iletiye To, From, FaultTo ve RelatesTo üst bilgilerini kopyalayın.

  • Tüm ileti özelliklerini yeni iletiye kopyalayın.

  • Yanıtı işlerken kullanılacak özgün istek iletisini depolayın.

  • Yeni istek iletisini döndür.

Yanıt işleme

  • Özgün istek iletisinin MessageVersion'ını alın.

  • Alınan yanıt iletisi için gövde okuyucuyu alın.

  • Aynı eylemi, gövde okuyucuyu ve özgün istek iletisinin MessageVersion'ını içeren yeni bir yanıt iletisi oluşturun.

  • != Addressing.None ise Addressing , Yeni iletiye To, From, FaultTo ve RelatesTo üst bilgilerini kopyalayın.

  • İleti özelliklerini yeni iletiye kopyalayın.

  • Yeni yanıt iletisini döndür.

Varsayılan olarak SoapProcessingBehavior, hizmet başlatıldığında istemci uç noktalarına RoutingBehavior otomatik olarak eklenir; ancak SOAP işlemenin özelliğini kullanarak tüm istemci uç noktalarına eklenip eklenmeyeceğini SoapProcessingEnabled denetleyebilirsiniz. Ayrıca davranışı doğrudan belirli bir uç noktaya ekleyebilir ve SOAP işlemenin daha ayrıntılı bir denetimi gerekiyorsa bu davranışı uç nokta düzeyinde etkinleştirebilir veya devre dışı bırakabilirsiniz.

Not

SOAP işleme, özgün istek iletisinden farklı bir MessageVersion gerektiren bir uç nokta için devre dışı bırakılırsa, iletiyi hedef uç noktaya göndermeden önce gereken SOAP değişikliklerini gerçekleştirmek için özel bir mekanizma sağlamanız gerekir.

Aşağıdaki örneklerde soapProcessingEnabled özelliği SoapProcessingBehavior'ın tüm istemci uç noktalarına otomatik olarak eklenmesini önlemek için kullanılır.

<behaviors>
  <!--default routing service behavior definition-->
  <serviceBehaviors>
    <behavior name="routingConfiguration">
      <routing filterTableName="filterTable1" soapProcessingEnabled="false"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
//create the default RoutingConfiguration
RoutingConfiguration rc = new RoutingConfiguration();
rc.SoapProcessingEnabled = false;

Dinamik Yapılandırma

Başka istemci uç noktaları eklediğinizde veya iletileri yönlendirmek için kullanılan filtreleri değiştirmeniz gerektiğinde, hizmetin Şu anda Yönlendirme Hizmeti aracılığıyla ileti alan uç noktalara kesintiye uğramasını önlemek için çalışma zamanında yapılandırmayı dinamik olarak güncelleştirmenin bir yolunuz olmalıdır. Bir yapılandırma dosyasının veya ana bilgisayar uygulamasının kodunun değiştirilmesi her zaman yeterli değildir çünkü her iki yöntem de uygulamanın geri dönüştürülmesine ihtiyaç duyar ve bu da şu anda aktarımda olan iletilerin kaybolmasına ve hizmetin yeniden başlatılmasını beklerken kapalı kalma süresine neden olabilir.

RoutingConfiguration öğesini yalnızca program aracılığıyla değiştirebilirsiniz. Başlangıçta bir yapılandırma dosyası kullanarak hizmeti yapılandırabilirsiniz, ancak yeni bir RoutingConfiguration oluşturup hizmet uzantısı tarafından sunulan yönteme ApplyConfiguration parametre olarak geçirerek yapılandırmayı RoutingExtension çalışma zamanında değiştirebilirsiniz. Şu anda aktarımda olan tüm iletiler önceki yapılandırma kullanılarak yönlendirilmeye devam ederken, ApplyConfiguration çağrısından sonra alınan iletiler yeni yapılandırmayı kullanır. Aşağıdaki örnek, Yönlendirme Hizmeti'nin bir örneğini oluşturmayı ve ardından yapılandırmayı değiştirmeyi gösterir.

RoutingConfiguration routingConfig = new RoutingConfiguration();
routingConfig.RouteOnHeadersOnly = true;
routingConfig.FilterTable.Add(new MatchAllMessageFilter(), endpointList);
RoutingBehavior routing = new RoutingBehavior(routingConfig);
routerHost.Description.Behaviors.Add(routing);
routerHost.Open();
// Construct a new RoutingConfiguration
RoutingConfiguration rc2 = new RoutingConfiguration();
ServiceEndpoint clientEndpoint = new ServiceEndpoint();
ServiceEndpoint clientEndpoint2 = new ServiceEndpoint();
// Add filters to the FilterTable in the new configuration
rc2.FilterTable.add(new MatchAllMessageFilter(),
       new List<ServiceEndpoint>() { clientEndpoint });
rc2.FilterTable.add(new MatchAllMessageFilter(),
       new List<ServiceEndpoint>() { clientEndpoint2 });
rc2.RouteOnHeadersOnly = false;
// Apply the new configuration to the Routing Service hosted in
routerHost.routerHost.Extensions.Find<RoutingExtension>().ApplyConfiguration(rc2);

Not

Yönlendirme Hizmeti'ni bu şekilde güncelleştirirken yalnızca yeni bir yapılandırma geçirmek mümkündür. Geçerli yapılandırmanın yalnızca seçili öğelerini değiştirmek veya geçerli yapılandırmaya yeni girdiler eklemek mümkün değildir; mevcut yapılandırmanın yerini alacak yeni bir yapılandırma oluşturmanız ve geçirmeniz gerekir.

Not

Önceki yapılandırma kullanılarak açılan tüm oturumlar önceki yapılandırmayı kullanmaya devam eder. Yeni yapılandırma yalnızca yeni oturumlar tarafından kullanılır.

Hata İşleme

CommunicationException İleti göndermeye çalışılırken herhangi bir sorunla karşılaşılırsa hata işleme gerçekleşir. Bu özel durumlar genellikle , ServerTooBusyExceptionveya CommunicationObjectFaultedExceptiongibi EndpointNotFoundExceptiontanımlı istemci uç noktasıyla iletişim kurmaya çalışırken bir sorunla karşılaşıldığını gösterir. Hata işleme kodu, communicationException'dan türetilmeyen bir diğer yaygın özel durum olan bir TimeoutException durum oluştuğunda göndermeyi yakalar ve yeniden denemeyi dener.

Yukarıdaki özel durumlardan biri oluştuğunda, Yönlendirme Hizmeti bir yedekleme uç noktaları listesine yük devreder. Tüm yedekleme uç noktaları bir iletişim hatasıyla başarısız olursa veya bir uç nokta hedef hizmetteki bir hatayı belirten bir özel durum döndürürse, Yönlendirme Hizmeti istemci uygulamasına bir hata döndürür.

Not

Hata işleme işlevi, ileti göndermeye çalışırken ve kanalı kapatmaya çalışırken oluşan özel durumları yakalar ve işler. Hata işleme kodu, iletişim kurduğu uygulama uç noktaları tarafından oluşturulan özel durumları algılamak veya işlemek için tasarlanmamıştır; bir FaultException hizmet tarafından atılan, Yönlendirme Hizmeti'nde FaultMessage olarak görünür ve istemciye geri akıtılır.

Yönlendirme hizmeti bir iletiyi geçirmeye çalıştığında bir hata oluşursa, FaultException normalde yönlendirme hizmeti olmadığında almak yerine istemci tarafında bir EndpointNotFoundException alabilirsiniz. Bu nedenle bir yönlendirme hizmeti, iç içe özel durumları incelemediğiniz sürece özel durumları maskeleyip tam saydamlık sağlamayabilir.

İzleme Özel Durumları

Bir listedeki uç noktaya ileti gönderme işlemi başarısız olduğunda, Yönlendirme Hizmeti sonuçta elde edilen özel durum verilerini izler ve özel durum ayrıntılarını Özel Durumlar adlı bir ileti özelliği olarak ekler. Bu, özel durum verilerini korur ve ileti denetçisi aracılığıyla kullanıcı programlama erişimine izin verir. Özel durum verileri, uç nokta adını ileti göndermeye çalışırken karşılaşılan özel durum ayrıntılarıyla eşleyen bir sözlükte ileti başına depolanır.

Yedekleme Uç Noktaları

Filtre tablosundaki her filtre girdisi isteğe bağlı olarak, birincil uç noktaya gönderirken iletim hatası durumunda kullanılan yedekleme uç noktalarının listesini belirtebilir. Böyle bir hata oluşursa, Yönlendirme Hizmeti iletiyi yedekleme uç noktası listesindeki ilk girişe iletmeyi dener. Bu gönderme girişimi bir iletim hatasıyla da karşılaşırsa, yedekleme listesindeki bir sonraki uç nokta denenmiş olur. Yönlendirme Hizmeti, ileti başarıyla alınana, tüm uç noktalar iletim hatası döndürene veya bir uç nokta tarafından iletim dışı hata döndürünceye kadar iletiyi listedeki her uç noktaya göndermeye devam eder.

Aşağıdaki örnekler, Yönlendirme Hizmeti'ni bir yedekleme listesi kullanacak şekilde yapılandırılır.

<routing>
  <filters>
    <!-- Create a MatchAll filter that catches all messages -->
    <filter name="MatchAllFilter1" filterType="MatchAll" />
  </filters>
  <filterTables>
    <!-- Set up the Routing Service's Message Filter Table -->
    <filterTable name="filterTable1">
        <!-- Add an entry that maps the MatchAllMessageFilter to the dead destination -->
        <!-- If that endpoint is down, tell the Routing Service to try the endpoints -->
        <!-- Listed in the backupEndpointList -->
        <add filterName="MatchAllFilter1" endpointName="deadDestination" backupList="backupEndpointList"/>
    </filterTable>
  </filterTables>
  <!-- Create the backup endpoint list -->
  <backupLists>
    <!-- Add an endpoint list that contains the backup destinations -->
    <backupList name="backupEndpointList">
      <add endpointName="realDestination" />
      <add endpointName="backupDestination" />
    </backupList>
  </backupLists>
</routing>
//create the endpoint list that contains the service endpoints we want to route to
List<ServiceEndpoint> backupList = new List<ServiceEndpoint>();
//add the endpoints in the order that the Routing Service should contact them
//first add the endpoint that we know is down
//clearly, normally you wouldn't know that this endpoint was down by default
backupList.Add(fakeDestination);
//then add the real Destination endpoint
//the Routing Service attempts to send to this endpoint only if it
//encounters a TimeOutException or CommunicationException when sending
//to the previous endpoint in the list.
backupList.Add(realDestination);
//add the backupDestination endpoint
//the Routing Service attempts to send to this endpoint only if it
//encounters a TimeOutException or CommunicationsException when sending
//to the previous endpoints in the list
backupList.Add(backupDestination);
//create the default RoutingConfiguration option
RoutingConfiguration rc = new RoutingConfiguration();
//add a MatchAll filter to the Routing Configuration's filter table
//map it to the list of endpoints defined above
//when a message matches this filter, it is sent to the endpoints in the list in order
//if an endpoint is down or does not respond (which the first endpoint won't
//since the client does not exist), the Routing Service automatically moves the message
//to the next endpoint in the list and try again.
rc.FilterTable.Add(new MatchAllMessageFilter(), backupList);

Desteklenen Hata Desenleri

Aşağıdaki tabloda, yedekleme uç noktası listelerinin kullanımıyla uyumlu desenler ve belirli desenler için hata işleme ayrıntılarını açıklayan notlar açıklanmaktadır.

Desen Oturum İşlem Alma Bağlamı Desteklenen Yedekleme Listesi Notlar
Tek Yönlü Yes bir yedekleme uç noktasında iletiyi yeniden göndermeyi dener. Bu ileti çok noktaya yayındaysa, yalnızca başarısız kanaldaki ileti yedekleme hedefine taşınır.
Tek Yönlü ✔️ Hayır Bir özel durum oluşturulur ve işlem geri alınır.
Tek Yönlü ✔️ Yes bir yedekleme uç noktasında iletiyi yeniden göndermeyi dener. İleti başarıyla alındıktan sonra tüm alma bağlamlarını tamamlayın. İleti herhangi bir uç nokta tarafından başarıyla alınmazsa alma bağlamını tamamlamayın.

Bu ileti çok noktaya yayın yaparken, alma bağlamı yalnızca ileti en az bir uç nokta (birincil veya yedekleme) tarafından başarıyla alındığında tamamlanır. Çok noktaya yayın yollarından hiçbirindeki uç noktalardan hiçbiri iletiyi başarıyla almazsa, alma bağlamını tamamlamayın.
Tek Yönlü ✔️ ✔️ Yes Önceki işlemi durdurun, yeni bir işlem oluşturun ve tüm iletileri yeniden gönderin. Hatayla karşılaşan iletiler bir yedekleme hedefine iletilir.

Tüm aktarımların başarılı olduğu bir işlem oluşturulduktan sonra alma bağlamlarını tamamlayın ve işlemi işleyin.
Tek Yönlü ✔️ Yes bir yedekleme uç noktasında iletiyi yeniden göndermeyi dener. Çok noktaya yayın senaryosunda yalnızca bir oturumda hatayla karşılaşan veya oturumu kapatılamayan iletiler yedekleme hedeflerine yeniden alınır.
Tek Yönlü ✔️ ✔️ Hayır Bir özel durum oluşturulur ve işlem geri alınır.
Tek Yönlü ✔️ ✔️ Yes bir yedekleme uç noktasında iletiyi yeniden göndermeyi dener. Tüm ileti hatasız olarak tamamlandıktan sonra, oturum artık ileti olmadığını gösterir ve Yönlendirme Hizmeti tüm giden oturum kanallarını başarıyla kapatır, tüm alma bağlamları tamamlanır ve gelen oturum kanalı kapatılır.
Tek Yönlü ✔️ ✔️ ✔️ Yes Geçerli işlemi durdurun ve yeni bir işlem oluşturun. Oturumdaki önceki tüm iletileri yeniden gönderin. Tüm iletilerin başarıyla gönderildiği ve oturumun artık ileti olmadığını gösterdiği bir işlem oluşturulduktan sonra, tüm giden oturum kanalları kapatılır, alma bağlamlarının tümü işlemle tamamlanır, gelen oturum kanalı kapatılır ve işlem işlenir.

Oturumlar çok noktaya yayın yapılırken, hata içermeyen iletiler öncekiyle aynı hedefe yinelenir ve hatayla karşılaşan iletiler yedekleme hedeflerine gönderilir.
Iki yönlü Yes Bir yedekleme hedefine gönderme. Bir kanal yanıt iletisi döndürdüğünde, yanıtı özgün istemciye döndürür.
Iki yönlü ✔️ Yes Kanaldaki tüm iletileri bir yedekleme hedefine gönderin. Bir kanal yanıt iletisi döndürdüğünde, yanıtı özgün istemciye döndürür.
Iki yönlü ✔️ Hayır Bir özel durum oluşturulur ve işlem geri alınır.
Iki yönlü ✔️ ✔️ Hayır Bir özel durum oluşturulur ve işlem geri alınır.
Çift Yönlü Hayır Oturum dışı çift yönlü iletişim şu anda desteklenmiyor.
Çift Yönlü ✔️ Yes Bir yedekleme hedefine gönderme.

Barındırma

Yönlendirme Hizmeti bir WCF hizmeti olarak uygulandığından, bir uygulama içinde şirket içinde veya IIS ya da WAS tarafından barındırılmalıdır. Bu barındırma ortamlarında kullanılabilen otomatik başlangıç ve yaşam döngüsü yönetim özelliklerinden yararlanmak için Yönlendirme Hizmeti'nin IIS, WAS veya Windows Hizmeti uygulamasında barındırılması önerilir.

Aşağıdaki örnek, Yönlendirme Hizmeti'ni bir uygulamada barındırmayı gösterir.

using (ServiceHost serviceHost =
                new ServiceHost(typeof(RoutingService)))

Yönlendirme Hizmeti'ni IIS veya WAS içinde barındırmak için bir hizmet dosyası (.svc) oluşturmanız veya hizmetin yapılandırma tabanlı etkinleştirmesini kullanmanız gerekir. Bir hizmet dosyası kullanırken, Service parametresini RoutingService kullanarak değerini belirtmeniz gerekir. Aşağıdaki örnek, IIS veya WAS ile Yönlendirme Hizmeti'ni barındırmak için kullanılabilecek örnek bir hizmet dosyası içerir.

<%@ ServiceHost Language="C#" Debug="true" Service="System.ServiceModel.Routing.RoutingService,
     System.ServiceModel.Routing, version=4.0.0.0, Culture=neutral,
     PublicKeyToken=31bf3856ad364e35" %>

Yönlendirme Hizmeti ve Kimliğe Bürünme

WCF Yönlendirme Hizmeti, iletileri hem göndermek hem de almak için kimliğe bürünme ile kullanılabilir. Her zamanki Windows kimliğe bürünme kısıtlamaları uygulanır. Kendi hizmetinizi yazarken kimliğe bürünme özelliğini kullanmak için hizmet veya hesap izinlerini ayarlamanız gerekiyorsa, yönlendirme hizmetiyle kimliğe bürünme özelliğini kullanmak için aynı adımları uygulamanız gerekir. Daha fazla bilgi için bkz . Temsilci Seçme ve Kimliğe Bürünme.

Yönlendirme hizmetiyle kimliğe bürünme, ASP.NET uyumluluk modundayken ASP.NET kimliğe bürünme kullanımını veya kimliğe bürünmeye izin verecek şekilde yapılandırılmış Windows kimlik bilgilerinin kullanılmasını gerektirir. ASP.NET uyumluluk modu hakkında daha fazla bilgi için bkz . WCF Hizmetleri ve ASP.NET.

Uyarı

WCF Yönlendirme Hizmeti, temel kimlik doğrulamasıyla kimliğe bürünme özelliğini desteklemez.

Yönlendirme hizmetiyle ASP.NET kimliğe bürünme özelliğini kullanmak için hizmet barındırma ortamında ASP.NET uyumluluk modunu etkinleştirin. Yönlendirme hizmeti zaten ASP.NET uyumluluk moduna izin verecek şekilde işaretlendi ve kimliğe bürünme otomatik olarak etkinleştirilir. Kimliğe bürünme, yönlendirme hizmetiyle ASP.NET tümleştirmesinin desteklenen tek kullanımıdır.

Yönlendirme hizmetiyle Windows kimlik bilgisi kimliğe bürünme özelliğini kullanmak için hem kimlik bilgilerini hem de hizmeti yapılandırmanız gerekir. İstemci kimlik bilgileri nesnesi (WindowsClientCredential, öğesinden ChannelFactoryerişilebilir), kimliğe bürünmeye izin vermek için ayarlanması gereken bir AllowedImpersonationLevel özellik tanımlar. Son olarak, hizmette olarak ayarlanacağı ImpersonateCallerForAllOperationstruedavranışı yapılandırmanız ServiceAuthorizationBehavior gerekir. Yönlendirme hizmeti, kimliğe bürünme özelliği etkinleştirilmiş iletileri iletmek için istemcilerin oluşturulup oluşturulmayacağına karar vermek için bu bayrağı kullanır.

Ayrıca bkz.