Sdílet prostřednictvím


Formátovací modul a selektor operace

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 ukazuje, jak implementovat vlastní formátovací modul operací, který analyzuje data parametrů z řetězce dotazu HTTP GET a volá metody pomocí dat.

Ukázka je založená na začínáme, který implementuje ICalculator kontrakt služby. 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.

V této ukázce najdete 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í operace odesílání 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 do modulu runtime vložit nový formátovací modul operací.

  • 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 operací 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.

Požadavek:

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

  • IClientMessageFormatter.SerializeRequest V metodě na klientovi vytvoří formátovací modul identifikátor URI s příslušnou adresou To a připojí název operace 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 jsou Via 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.

UriPathSuffixOperationSelector – třída

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

V této ukázce musí být na serveru implementováno, aby bylo možné vybrat příslušnou operaci, UriPathSuffixOperationSelector protože název operace je součástí identifikátoru URI HTTP GET místo hlavičky 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.

EnableHttpGetRequestsBehavior – třída

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 nastavena na implementaci IDispatchOperationSelector .

Wcf ve výchozím nastavení používá filtr adres přesné shody. 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átovacích 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 vytvořit potřebný formátovací modul 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átovacího modulu nainstalovaného zavaděčem typu WCF ve výchozím nastavení a buď ho nahradit, nebo přidat kompatibilní chování, které se má spustit po 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.

Na klientovi:

Implementace musí být implementována IClientMessageFormatter , aby bylo možné převést požadavky na požadavky HTTP GET a delegovat na původní formátovací modul 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 Open zavolání. V této ukázce si ukážeme, jak se formátovací modul před voláním Openručně upraví . Dalším způsobem, jak dosáhnout stejného cíle, je odvodit třídu, která ServiceHost 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í messageVersion atribut elementu textMessageEncoding na None.

    <bindings>
      <customBinding>
        <binding name="poxBinding">
          <textMessageEncoding messageVersion="None" />
          <httpTransport />
        </binding>
      </customBinding>
    </bindings>
    
  • App.config pro službu musí také určit vlastní EnableHttpGetRequestsBehavior přidáním do oddílu rozšíření chování a jeho použitím.

    <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í .

Na klientovi:

  • Implementace klienta se nemusí měnit.

  • App.config pro klienta musí používat vlastní 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í určovat stejné vlastní jako EnableHttpGetRequestsBehavior 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ě.

Nastavení, sestavení a spuštění ukázky
  1. Ujistěte se, že jste pro ukázky windows Communication Foundation provedli jednorázovou instalační proceduru.

  2. Pokud chcete sestavit řešení, postupujte podle pokynů v části Sestavení ukázek Windows Communication Foundation.

  3. Pokud chcete spustit ukázku v konfiguraci s jedním nebo více počítači, postupujte podle pokynů v části Spuštění ukázek windows Communication Foundation.