Sdílet prostřednictvím


Formátovač operací a selektor operací

Ukázka QueryStringFormatter ukazuje, jak lze body rozšiřitelnosti wcf (Windows Communication Foundation) použít k povolení dat zpráv v jiném formátu od toho, co WCF očekává. Ve výchozím nastavení formátovací moduly WCF očekávají, že parametry metody budou zahrnuty do elementu soap:body . Ukázka demonstruje, jak implementovat vlastní formátovací modul pro operace, který analyzuje data parametrů z řetězce dotazu HTTP GET a volá metody s využitím těchto dat.

Ukázka je založená na Začínáme, které implementuje smlouvu o službách ICalculator. Ukazuje, jak lze změnit sčítání, odečítání, násobení a dělení zpráv tak, aby používaly HTTP GET pro požadavky mezi klienty a HTTP POST se zprávami POX pro odpovědi mezi servery.

K tomu ukázka poskytuje následující:

  • QueryStringFormatter, který implementuje IClientMessageFormatter a IDispatchMessageFormatter pro klienta a server, v uvedeném pořadí, a zpracovává data v řetězci dotazu.

  • UriOperationSelector, který implementuje IDispatchOperationSelector na serveru k provedení dispečinku operací na základě názvu operace v požadavku GET.

  • EnableHttpGetRequestsBehavior chování koncového bodu (a odpovídající konfigurace), která do modulu runtime přidá potřebný selektor operací.

  • Ukazuje, jak vložit nový formátovač operací do modulu runtime.

  • V této ukázce jsou klient i služba konzolové aplikace (.exe).

Poznámka:

Postup nastavení a pokyny k sestavení pro tuto ukázku najdete na konci tohoto tématu.

Klíčové koncepty

QueryStringFormatter - Formátovací modul operace je komponenta WCF, která je zodpovědná za převod zprávy na pole objektů parametrů a pole objektů parametrů na zprávu. To se provádí na klientovi pomocí IClientMessageFormatter rozhraní a na serveru s rozhraním IDispatchMessageFormatter . Tato rozhraní umožňují uživatelům získat zprávy požadavků a odpovědí z metod Serialize a Deserialize metod.

V této ukázce QueryStringFormatter implementuje obě tato rozhraní a implementuje se na klientovi a serveru.

Žádost:

  • Ukázka používá třídu TypeConverter k převodu dat parametrů ve zprávě požadavku z a do řetězců. TypeConverter není-li k dispozici pro konkrétní typ, ukázkový formátovací modul vyvolá výjimku.

  • V metodě IClientMessageFormatter.SerializeRequest na klientovi formátovací modul vytvoří identifikátor URI s příslušnou adresou To a název operace připojí jako příponu. Tento název se používá k odeslání příslušné operace na serveru. Potom vezme pole objektů parametrů a serializuje data parametru do řetězce dotazu URI pomocí názvů parametrů a hodnot převedených TypeConverter třídou. Vlastnosti To a Via jsou pak nastaveny na tento identifikátor URI. MessageProperties je přístupný prostřednictvím Properties vlastnosti.

  • IDispatchMessageFormatter.DeserializeRequest V metodě na serveru načte Via formátovací modul identifikátor URI ve vlastnostech zprávy příchozího požadavku. Parsuje páry name-value v řetězci dotazu URI do názvů parametrů a hodnot a používá názvy parametrů a hodnoty k naplnění pole parametrů předaných do metody. Všimněte si, že k odeslání operace již došlo, takže přípona názvu operace je v této metodě ignorována.

Odpověď:

  • V této ukázce se http GET používá pouze pro požadavek. Formátovací modul deleguje odeslání odpovědi na původní formátovací modul, který by byl použit k vygenerování zprávy XML. Jedním z cílů této ukázky je ukázat, jak se takový delegující formátovací modul dá implementovat.

Třída UriPathSuffixOperationSelector

Rozhraní IDispatchOperationSelector umožňuje uživatelům implementovat vlastní logiku, pro kterou operaci má být odeslána konkrétní zpráva.

V tomto příkladu musí být na serveru implementováno UriPathSuffixOperationSelector, aby bylo možné vybrat příslušnou operaci, protože název operace je zahrnut v URI HTTP GET, nikoliv v hlavičce akce ve zprávě. Ukázka je nastavená tak, aby umožňovala pouze názvy operací nerozlišující malá a velká písmena.

Metoda SelectOperation vezme příchozí zprávu a vyhledá Via identifikátor URI ve vlastnostech zprávy. Extrahuje příponu názvu operace z identifikátoru URI, vyhledá interní tabulku a získá název operace, do které se má zpráva odeslat, a vrátí tento název operace.

Třída EnableHttpGetRequestsBehavior

Komponentu UriPathSuffixOperationSelector je možné nastavit programově nebo prostřednictvím chování koncového bodu. Ukázka implementuje EnableHttpGetRequestsBehavior chování zadané v konfiguračním souboru aplikace služby.

Na serveru:

Je OperationSelector nastaven na implementaci IDispatchOperationSelector.

WCF ve výchozím nastavení používá filtr adres přesného shodování. Identifikátor URI příchozí zprávy obsahuje příponu názvu operace následovanou řetězcem dotazu, který obsahuje data parametrů, takže chování koncového bodu také změní filtr adresy na filtr shody předpony. K tomuto účelu používá WCFPrefixEndpointAddressMessageFilter .

Instalace formátovačů operací

Chování operací, které určují formátovací moduly, jsou jedinečné. Jedno takové chování je vždy implementováno ve výchozím nastavení pro každou operaci, aby vytvořilo potřebný formátovač operace. Toto chování však vypadá jako jiné chování operace; nejsou identifikovatelné žádným jiným atributem. Aby bylo možné nainstalovat náhradní chování, musí implementace hledat konkrétní chování formátovatele, které je ve výchozím nastavení instalováno zavaděčem typu WCF, a buď ho nahradit, nebo přidat kompatibilní chování ke spuštění po tomto výchozím chování.

Toto chování formátovacích nástrojů operací lze nastavit programově před voláním CommunicationObject.Open nebo zadáním chování operace, které se spustí po výchozím nastavení. Nelze ho ale snadno nastavit pomocí chování koncového bodu (a proto podle konfigurace), protože model chování neumožňuje chování nahradit jiné chování nebo jinak upravit strom popisu.

V klientovi:

Implementace IClientMessageFormatter musí být provedena tak, aby bylo možné převést požadavky na HTTP GET požadavky a následně delegovat na původní formátovací modul pro zpracování odpovědí. To se provádí voláním EnableHttpGetRequestsBehavior.ReplaceFormatterBehavior pomocné metody.

To musí být provedeno před voláním CreateChannel.

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);
}

Na serveru:

  • Rozhraní IDispatchMessageFormatter musí být implementováno, aby mohlo číst požadavky HTTP GET a delegovat na původní formátovací modul pro zápis odpovědí. To se provádí voláním stejné EnableHttpGetRequestsBehavior.ReplaceFormatterBehavior pomocné metody jako klient (viz předchozí ukázka kódu).

  • To je nutné provést před tím, než je Open zavoláno. V této ukázce ukazujeme, jak je formátovací modul ručně upraven před voláním Open. Dalším způsobem, jak dosáhnout stejného cíle, je odvodit třídu od ServiceHost, která provádí volání EnableHttpGetRequestsBehavior.ReplaceFormatterBehavior před otevřením (příklady najdete v dokumentaci a ukázkách hostování).

Uživatelské prostředí

Na serveru:

  • Implementace serveru ICalculator se nemusí měnit.

  • App.config pro službu musí používat vlastní vazbu POX, která nastaví atribut messageVersion elementu textMessageEncoding na None.

    <bindings>
      <customBinding>
        <binding name="poxBinding">
          <textMessageEncoding messageVersion="None" />
          <httpTransport />
        </binding>
      </customBinding>
    </bindings>
    
  • App.config pro službu musí také obsahovat vlastní EnableHttpGetRequestsBehavior tím, že jej nejprve přidá do sekce rozšíření chování a následně jej použije.

    <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>
    
  • Před voláním Openpřidejte formátovací moduly operací .

V klientovi:

  • Implementace klienta se nemusí měnit.

  • App.config pro klienta musí používat uživatelsky definovanou vazbu POX, která nastaví messageVersion atribut elementu textMessageEncoding na None. Jedním z rozdílů ve službě je, že klient musí povolit ruční adresování, aby bylo možné změnit odchozí adresu To.

    <bindings>
      <customBinding>
        <binding name="poxBinding">
          <textMessageEncoding messageVersion="None" />
          <httpTransport manualAddressing="True" />
        </binding>
      </customBinding>
    </bindings>
    
  • App.config pro klienta musí zadat stejný vlastní EnableHttpGetRequestsBehavior, jako server.

  • Před voláním CreateChannel()přidejte formátovací moduly operací .

Při spuštění ukázky se požadavky na operace a odpovědi zobrazí v okně konzoly klienta. Všechny čtyři operace (sčítání, odečítání, násobení a dělení) musí proběhnout úspěšně.

Jak nastavit, sestavit a spustit ukázku
  1. Ujistěte se, že jste provedli instalační proceduru One-Time pro ukázky Windows Communication Foundation.

  2. Pro sestavení řešení postupujte podle pokynů v Sestavení ukázek Windows Communication Foundation.

  3. Pokud chcete spustit ukázku v konfiguraci pro jeden počítač nebo pro více počítačů, postupujte podle pokynů v Spuštění ukázek Windows Communication Foundation.