Benutzerdefinierter Nachrichtenencoder: KomprimierungsencoderCustom Message Encoder: Compression Encoder

In diesem Beispiel wird veranschaulicht, wie ein benutzerdefinierter Encoder mit der Windows Communication Foundation (WCF)Windows Communication Foundation (WCF)-Plattform implementiert wird.This sample demonstrates how to implement a custom encoder using the Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) platform.

Wichtig

Die Beispiele sind möglicherweise bereits auf dem Computer installiert.The samples may already be installed on your machine. Suchen Sie nach dem folgenden Verzeichnis (Standardverzeichnis), bevor Sie fortfahren.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Wenn dieses Verzeichnis nicht vorhanden ist, rufen Sie Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 auf, um alle Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) - und WFWF -Beispiele herunterzuladen.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) and WFWF samples. Dieses Beispiel befindet sich im folgenden Verzeichnis.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WCF\Extensibility\MessageEncoder\Compression

BeispieldetailsSample Details

Das Beispiel besteht aus einem Clientkonsolenprogramm (.exe), einem selbst gehosteten Dienstkonsolenprogramm (.exe) und einer Komprimierungsnachrichtenencoder-Bibliothek (.dll).This sample consists of a client console program (.exe), a self-hosted service console program (.exe) and a compression message encoder library (.dll). Der Dienst implementiert einen Vertrag, der ein Anforderungs-Antwort-Kommunikationsmuster definiert.The service implements a contract that defines a request-reply communication pattern. Der Vertrag wird durch die ISampleServer-Schnittstelle definiert, die allgemeine Zeichenfolgen-Echovorgänge (Echo und BigEcho) verfügbar macht.The contract is defined by the ISampleServer interface, which exposes basic string echoing operations (Echo and BigEcho). Der Client stellt synchrone Anforderungen an einen angegebenen Vorgang, und der Dienst antwortet dem Client, indem er die Nachricht wiederholt.The client makes synchronous requests to a given operation and the service replies by repeating the message back to the client. Client- und Dienstaktivität sind in den Konsolenfenstern sichtbar.Client and service activity is visible in the console windows. Das Beispiel soll zeigen, wie ein benutzerdefinierter Encoder geschrieben wird und wie sich das Komprimieren einer Nachricht auf das Netzwerk auswirkt.The intent of this sample is to show how to write a custom encoder and demonstrate the impact of compression of a message on the wire. Sie können dem Komprimierungsnachrichtenencoder eine Instrumentierung zum Berechnen der Nachrichtengröße und/oder der Verarbeitungszeit hinzufügen.You can add instrumentation to the compression message encoder to calculate message size, processing time, or both.

Hinweis

In .NET Framework 4 wurde die automatische Dekomprimierung auf einem WCFWCF-Client aktiviert, wenn der Server eine komprimierte Antwort sendet (erstellt mit einem Algorithmus wie GZip oder Deflate).In the .NET Framework 4, automatic decompression has been enabled on a WCFWCF client if the server is sending a compressed response (created with an algorithm such as GZip or Deflate). Bei einem im Internet über Internet Information Server (IIS) gehosteten Dienst kann IIS so konfiguriert werden, dass der Dienst eine komprimierte Antwort sendet.If the service is Web-hosted in Internet Information Server (IIS), then IIS can be configured for the service to send a compressed response. Dieses Beispiel kann verwendet werden, wenn die Komprimierung und Dekomprimierung für den Client und für den Dienst durchgeführt werden müssen oder wenn der Dienst selbst gehostet wird.This sample can be used if the requirement is to do compression and decompression on both the client and the service or if the service is self-hosted.

Das Beispiel zeigt, wie ein benutzerdefinierter Nachrichtenencoder erstellt und in eine WCFWCF-Anwendung integriert wird.The sample demonstrates how to build and integrate a custom message encoder into a WCFWCF application. Die Bibliothek "GZipEncoder.dll" wird sowohl mit dem Client als auch mit dem Dienst bereitgestellt.The library GZipEncoder.dll is deployed with both the client and the service. Das Beispiel zeigt auch, wie sich das Komprimieren von Nachrichten auswirkt.This sample also demonstrates the impact of compressing messages. Der Code in der "GZipEncoder.dll" zeigt Folgendes:The code in GZipEncoder.dll demonstrates the following:

  • Das Erstellen eines benutzerdefinierten Encoders und einer Encoder-Factory.Building a custom encoder and encoder factory.

  • Das Entwickeln eines Bindungselements für einen benutzerdefinierten Encoder.Developing a binding element for a custom encoder.

  • Das Verwenden der benutzerdefinierten Bindungskonfiguration zum Integrieren von benutzerdefinierten Bindungselementen.Using the custom binding configuration for integrating custom binding elements.

  • Das Entwickeln eines benutzerdefinierten Konfigurationshandlers, um die Dateikonfiguration eines benutzerdefinierten Bindungselements zu ermöglichen.Developing a custom configuration handler to allow file configuration of a custom binding element.

Wie schon erwähnt, gibt es mehrere Ebenen, die in einem benutzerdefinierten Encoder implementiert werden.As indicated previously, there are several layers that are implemented in a custom encoder. Um die Beziehungen zwischen den einzelnen Ebenen besser veranschaulichen zu können, enthält die folgende Liste eine vereinfachte Abfolge der Ereignisse beim Starten des Diensts.To better illustrate the relationship between each of these layers, a simplified order of events for service start-up is in the following list:

  1. Der Server startet.The server starts.

  2. Die Konfigurationsinformationen werden gelesen.The configuration information is read.

    1. Die Dienstkonfiguration registriert den benutzerdefinierten Konfigurationshandler.The service configuration registers the custom configuration handler.

    2. Der Diensthost wird erstellt und geöffnet.The service host is created and opened.

    3. Das benutzerdefinierte Konfigurationselement erstellt das benutzerdefinierte Bindungselement und gibt es zurück.The custom configuration element creates and returns the custom binding element.

    4. Das benutzerdefinierte Bindungselement erstellt eine Nachrichtenencoder-Factory und gibt sie zurück.The custom binding element creates and returns a message encoder factory.

  3. Eine Nachricht wird empfangen.A message is received.

  4. Die Nachrichtenencoder-Factory gibt einen Nachrichtenencoder zum Lesen der Nachricht und Schreiben der Antwort zurück.The message encoder factory returns a message encoder for reading in the message and writing out the response.

  5. Die Encoderebene wird in Form einer Klassenfactory implementiert.The encoder layer is implemented as a class factory. Nur die Encoderklassenfactory muss für den benutzerdefinierten Encoder öffentlich verfügbar gemacht werden.Only the encoder class factory must be publicly exposed for the custom encoder. Das Factoryobjekt wird vom Bindungselement zurückgegeben, wenn das ServiceHost-Objekt oder das ChannelFactory<TChannel>-Objekt erstellt wird.The factory object is returned by the binding element when the ServiceHost or ChannelFactory<TChannel> object is created. Nachrichtenencoder können im Puffermodus oder im Streamingmodus arbeiten.Message encoders can operate in a buffered or streaming mode. In diesem Beispiel werden sowohl der Puffermodus als auch der Streamingmodus veranschaulicht.This sample demonstrates both buffered mode and streaming mode.

Für jeden Modus gibt es eine zugehörige ReadMessage- und WriteMessage-Methode in der abstrakten MessageEncoder-Klasse.For each mode there is an accompanying ReadMessage and WriteMessage method on the abstract MessageEncoder class. In diesen Methoden findet der größte Teil der Codierungsarbeit statt.A majority of the encoding work takes place in these methods. Das Beispiel schließt die vorhandenen Text- und Binärnachrichtenencoder ein.The sample wraps the existing text and binary message encoders. Auf diese Weise kann es das Lesen und Schreiben der Übertragungsdarstellung von Nachrichten an den inneren Encoder delegieren, und die Ergebnisse können vom Komprimierungsencoder komprimiert oder dekomprimiert werden.This allows the sample to delegate the reading and writing of the wire representation of messages to the inner encoder and allows the compression encoder to compress or decompress the results. Da keine Pipeline zur Nachrichtencodierung vorhanden ist, stellt dies das einzige Modell zum Verwenden mehrerer Encoder in WCFWCF dar.Because there is no pipeline for message encoding, this is the only model for using multiple encoders in WCFWCF. Nachdem die Nachricht dekomprimiert wurde, wird die resultierende Nachricht an den Stapel weitergegeben, um vom Kanalstapel verarbeitet zu werden.Once the message has been decompressed, the resulting message is passed up the stack for the channel stack to handle. Während der Komprimierung wird die resultierende komprimierte Nachricht direkt in den bereitgestellten Stream geschrieben.During compression, the resulting compressed message is written directly to the stream provided.

In diesem Beispiel werden Hilfsmethoden (CompressBuffer und DecompressBuffer) verwendet, um die Konvertierung von Puffern in Streams zum Verwenden der GZipStream-Klasse auszuführen.This sample uses helper methods (CompressBuffer and DecompressBuffer) to perform conversion from buffers to streams to use the GZipStream class.

Die gepufferten ReadMessage-Klasse und WriteMessage-Klasse machen von der BufferManager-Klasse Gebrauch.The buffered ReadMessage and WriteMessage classes make use of the BufferManager class. Auf den Encoder kann nur über die Encoder-Factory zugegriffen werden.The encoder is accessible only through the encoder factory. Die abstrakte MessageEncoderFactory-Klasse bietet zum Zugreifen auf den aktuellen Encoder eine Eigenschaft namens Encoder und zum Erstellen eines Encoders, der Sitzungen unterstützt, eine Methode namens CreateSessionEncoder.The abstract MessageEncoderFactory class provides a property named Encoder for accessing the current encoder and a method named CreateSessionEncoder for creating an encoder that supports sessions. Ein solcher Encoder kann in Situationen verwendet werden, in denen der Kanal Sitzungen unterstützt, geordnet und zuverlässig ist.Such an encoder can be used in the scenario where the channel supports sessions, is ordered and is reliable. In diesem Szenario ist in jeder Sitzung, in der Daten zur Übertragung geschrieben werden, eine Optimierung möglich.This scenario allows for optimization in each session of the data written to the wire. Wenn dies nicht erwünscht ist, sollte die Basismethode nicht überladen werden.If this is not desired, the base method should not be overloaded. Die Encoder-Eigenschaft bietet einen Mechanismus zum Zugreifen auf den sitzungslosen Encoder, und der Wert der Eigenschaft wird von der Standardimplementierung der CreateSessionEncoder-Methode zurückgegeben.The Encoder property provides a mechanism for accessing the session-less encoder and the default implementation of the CreateSessionEncoder method returns the value of the property. Da das Beispiel einen vorhandenen Encoder einschließt, um Komprimierung zu ermöglichen, akzeptiert die MessageEncoderFactory-Implementierung eine MessageEncoderFactory, die die innere Encoder-Factory darstellt.Because the sample wraps an existing encoder to provide compression, the MessageEncoderFactory implementation accepts a MessageEncoderFactory that represents the inner encoder factory.

Nachdem nun der Encoder und die Encoder-Factory definiert sind, können sie mit einem WCFWCF-Client und -Dienst verwendet werden.Now that the encoder and encoder factory are defined, they can be used with a WCFWCF client and service. Allerdings müssen diese Encoder dem Kanalstapel hinzugefügt werden.However, these encoders must be added to the channel stack. Zum manuellen Hinzufügen dieser Encoder-Factory können Sie Klassen von der ServiceHost-Klasse und der ChannelFactory<TChannel>-Klasse ableiten und die OnInitialize-Methoden überschreiben.You can derive classes from the ServiceHost and ChannelFactory<TChannel> classes and override the OnInitialize methods to add this encoder factory manually. Sie können die Encoder-Factory auch über ein benutzerdefiniertes Bindungselement verfügbar machen.You can also expose the encoder factory through a custom binding element.

Zum Erstellen eines neuen benutzerdefinierten Bindungselements leiten Sie eine Klasse von der BindingElement-Klasse ab.To create a new custom binding element, derive a class from the BindingElement class. Es gibt jedoch mehrere Typen von Bindungselementen.There are, however, several types of binding elements. Um sicherzustellen, dass das benutzerdefinierte Bindungselement als ein Nachrichtencodierungs-Bindungselement erkannt wird, müssen Sie auch das MessageEncodingBindingElement implementieren.To ensure that the custom binding element is recognized as a message encoding binding element, you also must implement the MessageEncodingBindingElement. Das MessageEncodingBindingElement macht eine Methode zum Erstellen einer neuen Nachrichtenencoder-Factory verfügbar (CreateMessageEncoderFactory), die so implementiert ist, dass sie eine Instanz der übereinstimmenden Nachrichtenencoder-Factory zurückgibt.The MessageEncodingBindingElement exposes a method for creating a new message encoder factory (CreateMessageEncoderFactory), which is implemented to return an instance of the matching message encoder factory. Außerdem besitzt das MessageEncodingBindingElement eine Eigenschaft zum Angeben der Adressierungsversion.Additionally, the MessageEncodingBindingElement has a property to indicate the addressing version. Da dieses Beispiel die vorhandenen Encoder einschließt, schließt die Implementierung des Beispiels auch die vorhandenen Encoderbindungselemente ein und nimmt ein inneres Encoderbindungselement als Parameter für den Konstruktor entgegen, das es über eine Eigenschaft verfügbar macht.Because this sample wraps the existing encoders, the sample implementation also wraps the existing encoder binding elements and takes an inner encoder binding element as a parameter to the constructor and exposes it through a property. Das folgende Codebeispiel zeigt die Implementierung der GZipMessageEncodingBindingElement-Klasse.The following sample code shows the implementation of the GZipMessageEncodingBindingElement class.

public sealed class GZipMessageEncodingBindingElement   
                        : MessageEncodingBindingElement //BindingElement  
                        , IPolicyExportExtension  
{  

    //We use an inner binding element to store information   
    //required for the inner encoder.  
    MessageEncodingBindingElement innerBindingElement;  

        //By default, use the default text encoder as the inner encoder.  
        public GZipMessageEncodingBindingElement()  
            : this(new TextMessageEncodingBindingElement()) { }  

    public GZipMessageEncodingBindingElement(MessageEncodingBindingElement messageEncoderBindingElement)  
    {  
        this.innerBindingElement = messageEncoderBindingElement;  
    }  

    public MessageEncodingBindingElement InnerMessageEncodingBindingElement  
    {  
        get { return innerBindingElement; }  
        set { innerBindingElement = value; }  
    }  

    //Main entry point into the encoder binding element.   
    // Called by WCF to get the factory that creates the  
    //message encoder.  
    public override MessageEncoderFactory CreateMessageEncoderFactory()  
    {  
        return new   
GZipMessageEncoderFactory(innerBindingElement.CreateMessageEncoderFactory());  
    }  

    public override MessageVersion MessageVersion  
    {  
        get { return innerBindingElement.MessageVersion; }  
        set { innerBindingElement.MessageVersion = value; }  
    }  

    public override BindingElement Clone()  
    {  
        return new   
        GZipMessageEncodingBindingElement(this.innerBindingElement);  
    }  

    public override T GetProperty<T>(BindingContext context)  
    {  
        if (typeof(T) == typeof(XmlDictionaryReaderQuotas))  
        {  
            return innerBindingElement.GetProperty<T>(context);  
        }  
        else   
        {  
            return base.GetProperty<T>(context);  
        }  
    }  

    public override IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingContext context)  
    {  
        if (context == null)  
            throw new ArgumentNullException("context");  

        context.BindingParameters.Add(this);  
        return context.BuildInnerChannelFactory<TChannel>();  
    }  

    public override IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context)  
    {  
        if (context == null)  
            throw new ArgumentNullException("context");  

        context.BindingParameters.Add(this);  
        return context.BuildInnerChannelListener<TChannel>();  
    }  

    public override bool CanBuildChannelListener<TChannel>(BindingContext context)  
    {  
        if (context == null)  
            throw new ArgumentNullException("context");  

        context.BindingParameters.Add(this);  
        return context.CanBuildInnerChannelListener<TChannel>();  
    }  

    void IPolicyExportExtension.ExportPolicy(MetadataExporter exporter, PolicyConversionContext policyContext)  
    {  
        if (policyContext == null)  
        {  
            throw new ArgumentNullException("policyContext");  
        }  
       XmlDocument document = new XmlDocument();  
       policyContext.GetBindingAssertions().Add(document.CreateElement(  
            GZipMessageEncodingPolicyConstants.GZipEncodingPrefix,  
            GZipMessageEncodingPolicyConstants.GZipEncodingName,  
            GZipMessageEncodingPolicyConstants.GZipEncodingNamespace));  
    }  
}  

Beachten Sie, dass die GZipMessageEncodingBindingElement-Klasse die IPolicyExportExtension-Schnittstelle implementiert, sodass dieses Bindungselement als Richtlinie in Metadaten exportiert werden kann, wie im folgenden Beispiel gezeigt.Note that GZipMessageEncodingBindingElement class implements the IPolicyExportExtension interface, so that this binding element can be exported as a policy in metadata, as shown in the following example.

<wsp:Policy wsu:Id="BufferedHttpSampleServer_ISampleServer_policy">  
    <wsp:ExactlyOne>  
      <wsp:All>  
        <gzip:text xmlns:gzip=  
        "http://schemas.microsoft.com/ws/06/2004/mspolicy/netgzip1" />   
       <wsaw:UsingAddressing />   
     </wsp:All>  
   </wsp:ExactlyOne>  
</wsp:Policy>  

Die GZipMessageEncodingBindingElementImporter-Klasse implementiert die IPolicyImportExtension-Schnittstelle, diese Klasse importiert die Richtlinie für GZipMessageEncodingBindingElement.The GZipMessageEncodingBindingElementImporter class implements the IPolicyImportExtension interface, this class imports policy for GZipMessageEncodingBindingElement. Zum Importieren von Richtlinien in die Konfigurationsdatei kann das Tool "Svcutil.exe" verwendet werden. Zum Umgang mit GZipMessageEncodingBindingElement sollte der "Svcutil.exe.config" Folgendes hinzugefügt werden.Svcutil.exe tool can be used to import policies to the configuration file, to handle GZipMessageEncodingBindingElement, the following should be added to Svcutil.exe.config.

<configuration>  
  <system.serviceModel>  
    <extensions>  
      <bindingElementExtensions>  
        <add name="gzipMessageEncoding"   
          type=  
            "Microsoft.ServiceModel.Samples.GZipMessageEncodingElement, GZipEncoder, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />  
      </bindingElementExtensions>  
    </extensions>  
    <client>  
      <metadata>  
        <policyImporters>  
          <remove type=  
"System.ServiceModel.Channels.MessageEncodingBindingElementImporter, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />  
          <extension type=  
"Microsoft.ServiceModel.Samples.GZipMessageEncodingBindingElementImporter, GZipEncoder, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />  
        </policyImporters>  
      </metadata>  
    </client>  
  </system.serviceModel>  
</configuration>  

Nachdem nun ein passendes Bindungselement für den Komprimierungsencoder vorhanden ist, kann dieser programmgesteuert als Hook in den Dienst oder Client eingesetzt werden, indem ein neues benutzerdefiniertes Bindungsobjekt erstellt und dem benutzerdefinierten Bindungselement hinzugefügt wird, wie im folgenden Beispielcode gezeigt.Now that there is a matching binding element for the compression encoder, it can be programmatically hooked into the service or client by constructing a new custom binding object and adding the custom binding element to it, as shown in the following sample code.

ICollection<BindingElement> bindingElements = new List<BindingElement>();  
HttpTransportBindingElement httpBindingElement = new HttpTransportBindingElement();  
GZipMessageEncodingBindingElement compBindingElement = new GZipMessageEncodingBindingElement ();  
bindingElements.Add(compBindingElement);  
bindingElements.Add(httpBindingElement);  
CustomBinding binding = new CustomBinding(bindingElements);  
binding.Name = "SampleBinding";  
binding.Namespace = "http://tempuri.org/bindings";  

Obwohl dies für die meisten Benutzerszenarios ausreichen sollte, ist die Unterstützung einer Dateikonfiguration wichtig, wenn der Dienst im Web gehostet werden soll.While this may be sufficient for the majority of user scenarios, supporting a file configuration is critical if a service is to be Web-hosted. Zur Unterstützung des Webhostszenarios müssen Sie einen benutzerdefinierten Konfigurationshandler erstellen, damit ein benutzerdefiniertes Bindungselement in einer Datei konfiguriert werden kann.To support the Web-hosted scenario, you must develop a custom configuration handler to allow a custom binding element to be configurable in a file.

Einen Konfigurationshandler für das Bindungselement können Sie auf dem von .NET Framework 2.0.NET Framework 2.0 bereitgestellten Konfigurationssystem erstellen.You can build a configuration handler for the binding element on top of the configuration system provided by the .NET Framework 2.0.NET Framework 2.0. Der Konfigurationshandler für das Bindungselement muss von der BindingElementExtensionElement-Klasse abgeleitet sein.The configuration handler for the binding element must derive from the BindingElementExtensionElement class. Mithilfe der BindingElementType-Eigenschaft wird dem Konfigurationssystem der Typ des Bindungselements, das für diesen Abschnitt erstellt werden soll, mitgeteilt.The BindingElementType property is used to inform the configuration system of the type of binding element to create for this section. Sämtliche Aspekte des BindingElement, die festgelegt werden können, sollten in der abgeleiteten BindingElementExtensionElement-Klasse als Eigenschaften zugänglich gemacht werden.All aspects of the BindingElement that can be set should be exposed as properties in the BindingElementExtensionElement derived class. Das ConfigurationPropertyAttribute dient als Hilfe beim Zuordnen der Konfigurationselementattribute zu den Eigenschaften und – wenn Attribute fehlen – beim Einstellen von Standardwerten.The ConfigurationPropertyAttribute is used to assist in mapping the configuration element attributes to the properties and setting default values if attributes are missing. Nachdem die Werte aus der Konfiguration geladen und auf die Eigenschaften angewendet wurden, wird die CreateBindingElement-Methode aufgerufen, die die Eigenschaften in eine konkrete Instanz eines Bindungselements konvertiert.After the values from configuration are loaded and applied to the properties, the CreateBindingElement method is called, which converts the properties into a concrete instance of a binding element. Mit der ApplyConfiguration-Methode werden die Eigenschaften aus der abgeleiteten BindingElementExtensionElement-Klasse in die Werte konvertiert, die im neu erstellten Bindungselement festgelegt werden sollen.The ApplyConfiguration method is used to convert the properties on the BindingElementExtensionElement derived class into the values to be set on the newlycreated binding element.

Das folgenden Codebeispiel zeigt die Implementierung des GZipMessageEncodingElement.The following sample code shows the implementation of the GZipMessageEncodingElement.

public class GZipMessageEncodingElement : BindingElementExtensionElement  
{  
    public GZipMessageEncodingElement()  
    {  
    }  

//Called by the WCF to discover the type of binding element this   
//config section enables  
    public override Type BindingElementType  
    {  
        get { return typeof(GZipMessageEncodingBindingElement); }  
    }  

    //The only property we need to configure for our binding element is   
    //the type of inner encoder to use. Here, we support text and  
    //binary.  
    [ConfigurationProperty("innerMessageEncoding",   
                         DefaultValue = "textMessageEncoding")]  
    public string InnerMessageEncoding  
    {  
        get { return (string)base["innerMessageEncoding"]; }  
        set { base["innerMessageEncoding"] = value; }  
    }  

    //Called by the WCF to apply the configuration settings (the   
    //property above) to the binding element  
    public override void ApplyConfiguration(BindingElement bindingElement)  
    {  
        GZipMessageEncodingBindingElement binding =   
                (GZipMessageEncodingBindingElement)bindingElement;  
        PropertyInformationCollection propertyInfo =   
                    this.ElementInformation.Properties;  
        if (propertyInfo["innerMessageEncoding"].ValueOrigin !=   
                                     PropertyValueOrigin.Default)  
        {  
            switch (this.InnerMessageEncoding)  
            {  
                case "textMessageEncoding":  
                    binding.InnerMessageEncodingBindingElement =   
                      new TextMessageEncodingBindingElement();  
                    break;  
                case "binaryMessageEncoding":  
                    binding.InnerMessageEncodingBindingElement =   
                         new BinaryMessageEncodingBindingElement();  
                    break;  
            }  
        }  
    }  

    //Called by the WCF to create the binding element  
    protected override BindingElement CreateBindingElement()  
    {  
        GZipMessageEncodingBindingElement bindingElement =   
                new GZipMessageEncodingBindingElement();  
        this.ApplyConfiguration(bindingElement);  
        return bindingElement;  
    }  
}   

Dieser Konfigurationshandler ordnet die folgende Darstellung in der App.config oder Web.config für den Dienst oder Client zu.This configuration handler maps to the following representation in the App.config or Web.config for the service or client.

<gzipMessageEncoding innerMessageEncoding="textMessageEncoding" />  

Um diesen Konfigurationshandler zu verwenden, er muss registriert werden innerhalb der <system.serviceModel > Element, wie in der folgenden Beispielkonfiguration dargestellt.To use this configuration handler, it must be registered within the <system.serviceModel> element, as shown in the following sample configuration.

<extensions>  
    <bindingElementExtensions>  
       <add   
           name="gzipMessageEncoding"   
           type=  
           "Microsoft.ServiceModel.Samples.GZipMessageEncodingElement,  
           GZipEncoder, Version=1.0.0.0, Culture=neutral,   
           PublicKeyToken=null" />  
      </bindingElementExtensions>  
</extensions>  

Beim Ausführen des Servers werden die Vorgangsanforderungen und -antworten im Konsolenfenster angezeigt.When you run the server, the operation requests and responses are displayed in the console window. Drücken Sie im Fenster die EINGABETASTE, um den Server zu schließen.Press ENTER in the window to shut down the server.

Press Enter key to Exit.  

        Server Echo(string input) called:  
        Client message: Simple hello  

        Server BigEcho(string[] input) called:  
        64 client messages  

Beim Ausführen des Clients werden die Vorgangsanforderungen und -antworten im Konsolenfenster angezeigt.When you run the client, the operation requests and responses are displayed in the console window. Drücken Sie im Clientfenster die EINGABETASTE, um den Client zu schließen.Press ENTER in the client window to shut down the client.

Calling Echo(string):  
Server responds: Simple hello Simple hello  

Calling BigEcho(string[]):  
Server responds: Hello 0  

Press <ENTER> to terminate client.  

So können Sie das Beispiel einrichten, erstellen und ausführenTo set up, build, and run the sample

  1. Installieren Sie ASP.NETASP.NET 4.0 mithilfe des folgenden Befehls:Install ASP.NETASP.NET 4.0 using the following command:

    %windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable  
    
  2. Stellen Sie sicher, dass Sie ausgeführt haben die Setupprozedur für die Windows Communication Foundation-Beispiele zum einmaligen.Ensure that you have performed the One-Time Setup Procedure for the Windows Communication Foundation Samples.

  3. Führen Sie zum Erstellen der Projektmappe die Anweisungen im Erstellen der Windows Communication Foundation-Beispiele.To build the solution, follow the instructions in Building the Windows Communication Foundation Samples.

  4. Um das Beispiel in einer einzelnen oder computerübergreifenden Konfiguration ausführen möchten, folgen Sie den Anweisungen Ausführen der Windows Communication Foundation-Beispiele.To run the sample in a single- or cross-machine configuration, follow the instructions in Running the Windows Communication Foundation Samples.

Wichtig

Die Beispiele sind möglicherweise bereits auf dem Computer installiert.The samples may already be installed on your machine. Suchen Sie nach dem folgenden Verzeichnis (Standardverzeichnis), bevor Sie fortfahren.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Wenn dieses Verzeichnis nicht vorhanden ist, rufen Sie Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 auf, um alle Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) - und WFWF -Beispiele herunterzuladen.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) and WFWF samples. Dieses Beispiel befindet sich im folgenden Verzeichnis.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WCF\Extensibility\MessageEncoder\Compression

Siehe auchSee Also