V minulém článku jsem ukazoval možnosti routování, kde jsem vše potřebné nastavil v konfiguračním souboru a dnes si ukážeme jak aplikovat nové pravidla pro směrování za běhu služby. Např. naše routovací služba může provádět v jiném vlákně kontrolu stavu jednotlivých služeb a v případě, že služba nebude schopna momentálně přijímat žádné požadavky, můžeme dynamicky změnit podmínku pro směrování zpráv a nyní přeposílat zprávy na jinou službu.

Musíme si tedy vytvořit novou routovací konfiguraci, která obsahuje směrovací tabulku s jednotlivými filtry:

private static RoutingConfiguration NewRoutingConfiguration()
{
    // vytvorim si smerovaci tabulku
    var filterTable = new MessageFilterTable<IEnumerable<ServiceEndpoint>>();
    // pridam dva filtry
    MessageFilter addFilter = new ActionMessageFilter("http://tempuri.org/ICalculator/Add");
    MessageFilter subtractFilter = new ActionMessageFilter("http://tempuri.org/ICalculator/Subtract");
    // definice endpointu na ktere se budou zpravy preposilat
    ServiceEndpoint calc1 = new ServiceEndpoint(
        ContractDescription.GetContract(typeof(IRequestReplyRouter)),
        new BasicHttpBinding(),
        new EndpointAddress("http://localhost:9000/servicemodelsamples/calcservice1"));
    ServiceEndpoint calc2 = new ServiceEndpoint(
        ContractDescription.GetContract(typeof(IRequestReplyRouter)),
        new BasicHttpBinding(),
        new EndpointAddress("http://localhost:9001/servicemodelsamples/calcservice2"));
    // filtry pridam do smerovaci tabulky
    filterTable.Add(addFilter, new List<ServiceEndpoint> { calc2 });
    filterTable.Add(subtractFilter, new List<ServiceEndpoint> { calc1 });
    // vratim nove vytvorenou konfiguraci
    return new RoutingConfiguration(filterTable, false);
}

Jedná se úplně o stejnou konfiguraci jako v minulém článku, akorát jsem provedl záměnu služeb, tzn. že se volání metody Add vykoná na službě CalculatorService2 místo CalculatorService1.

Poté si z kolekce Extensions objektu ServiceHost získáme objekt RoutingExtensions, na kterém zavoláme metodu ApplyConfiguration a jako parametr předáme naši nově vytvořenou konfiguraci

var re = serviceHost.Extensions.Find<RoutingExtension>();
if (re != null)
{
    re.ApplyConfiguration(NewRoutingConfiguration());
    Console.WriteLine("Configuration changed");
}

Zde můžete vidět výsledek po spuštění této ukázky

ServiceHost – aplikace, která hostuje služby CalculatorService1 a CalculatorService2image

RoutingServiceHost – naše routovací služba

 image

RoutingClient – klient, který volá metody Add a Subtract

image

Nejdříve spustím Clienta, který zavolá metodu Add a Subtract, poté změním konfiguraci na straně routovací služby a nakonec na straně clienta opět zavolám stejné metody a tentokrát se vykonají na jiných službách, přesně tak jak jsem to chtěl v konfiguraci