Gewusst wie: Hosten eines WCF-Diensts in WASHow to: Host a WCF Service in WAS

In diesem Thema werden die grundlegenden Schritte vorgestellt, die für die Erstellung eines in WAS (Windows Process Activation Services) gehosteten Windows Communication Foundation (WCF)Windows Communication Foundation (WCF)-Diensts erforderlich sind.This topic outlines the basic steps required to create a Windows Process Activation Services (also known as WAS) hosted Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) service. WAS ist der neue Prozessaktivierungsdienst, der eine Generalisierung der Funktionen der Internetinformationsdienste (IIS) darstellt, die mit Nicht-HTTP-Transportprotokollen arbeiten.WAS is the new process activation service that is a generalization of Internet Information Services (IIS) features that work with non-HTTP transport protocols. WCFWCF verwendet die Schnittstelle des Listeneradapters, um Aktivierungsanforderungen weiterzugeben, die über die von WCFWCF unterstützten Nicht-HTTP-Protokolle, wie etwa TCP, Named Pipes und Message Queuing, empfangen wurden. uses the listener adapter interface to communicate activation requests that are received over the non-HTTP protocols supported by WCFWCF, such as TCP, named pipes, and Message Queuing.

Diese Hostingoption erfordert, dass die WAS-Aktivierungskomponenten korrekt installiert und konfiguriert wurden. Es muss jedoch keinerlei Hostcode für die Anwendung geschrieben werden.This hosting option requires that WAS activation components are properly installed and configured, but it does not require any hosting code to be written as part of the application. Weitere Informationen finden Sie unterFor more information aboutInstallieren und Konfigurieren von WAS, finden Sie unter Vorgehensweise: Installieren und Konfigurieren von WCF-Aktivierungskomponenten. installing and configuring WAS, see How to: Install and Configure WCF Activation Components.

Warnung

Die WAS-Aktivierung wird nicht unterstützt, wenn die Anforderungsverarbeitungspipeline des Webservers auf den klassischen Modus festgelegt ist.WAS activation is not supported if the web server’s request processing pipeline is set to Classic mode. Die Anforderungsverarbeitungspipeline des Webservers muss auf den integrierten Modus festgelegt sein, wenn die WAS-Aktivierung verwendet werden soll.The web server’s request processing pipeline must be set to Integrated mode if WAS activation is to be used.

Wenn ein WCFWCF-Dienst in WAS gehostet wird, werden die Standardbindungen auf die übliche Weise verwendet.When a WCFWCF service is hosted in WAS, the standard bindings are used in the usual way. Werden jedoch NetTcpBinding und NetNamedPipeBinding verwendet, um einen WAS-gehosteten Dienst zu konfigurieren, muss eine Bedingung erfüllt sein.However, when using the NetTcpBinding and the NetNamedPipeBinding to configure a WAS-hosted service, a constraint must be satisfied. Wenn verschiedene Endpunkte denselben Transport verwenden, müssen die Bindungseinstellungen für die folgenden sieben Eigenschaften übereinstimmen:When different endpoints use the same transport, the binding settings have to match on the following seven properties:

  • ConnectionBufferSizeConnectionBufferSize

  • ChannelInitializationTimeoutChannelInitializationTimeout

  • MaxPendingConnectionsMaxPendingConnections

  • MaxOutputDelayMaxOutputDelay

  • MaxPendingAcceptsMaxPendingAccepts

  • ConnectionPoolSettings.IdleTimeoutConnectionPoolSettings.IdleTimeout

  • ConnectionPoolSettings.MaxOutboundConnectionsPerEndpointConnectionPoolSettings.MaxOutboundConnectionsPerEndpoint

Andernfalls bestimmt der zuerst initialisierte Endpunkt die Werte dieser Eigenschaften, und später hinzugefügte Endpunkte lösen eine ServiceActivationException aus, wenn ihre Einstellungen diesen Einstellungen nicht entsprechen.Otherwise, the endpoint that is initialized first always determines the values of these properties, and endpoints added later throw a ServiceActivationException if they do not match those settings.

Eine Kopie der Quelle dieses Beispiels, finden Sie unter TCP-Aktivierung.For the source copy of this example, see TCP Activation.

So erstellen Sie einen grundlegenden durch WAS gehosteten DienstTo create a basic service hosted by WAS

  1. Definieren Sie einen Dienstvertrag für den Diensttyp.Define a service contract for the type of service.

    [ServiceContract]
    public interface ICalculator
    {
       [OperationContract]
       double Add(double n1, double n2);
       [OperationContract]
       double Subtract(double n1, double n2);
       [OperationContract]
       double Multiply(double n1, double n2);
       [OperationContract]
       double Divide(double n1, double n2);
    }
    
    
  2. Implementieren Sie den Dienstvertrag in einer Dienstklasse.Implement the service contract in a service class. Beachten Sie, dass die Adresse oder die Bindungsinformationen in der Implementierung des Diensts nicht angegeben werden.Note that address or binding information is not specified inside the implementation of the service. Es muss auch kein Code geschrieben werden, um Informationen aus der Konfigurationsdatei abzurufen.Also, code does not have to be written to retrieve that information from the configuration file.

    public class CalculatorService : ICalculator
    {
       public double Add(double n1, double n2)
       {
          return n1 + n2;
       }
       public double Subtract(double n1, double n2)
       {
          return n1 - n2;
       }
       public double Multiply(double n1, double n2)
       {
          return n1 * n2;
       }
       public double Divide(double n1, double n2)
       {
          return n1 / n2;
       }
    } 
    
    
  3. Erstellen Sie eine Web.config-Datei, um die NetTcpBinding-Bindung zu definieren, die von den CalculatorService-Endpunkten verwendet wird.Create a Web.config file to define the NetTcpBinding binding to be used by the CalculatorService endpoints.

    <?xml version="1.0" encoding="utf-8" ?>  
    <configuration>  
      <system.serviceModel>  
        <bindings>  
          <netTcpBinding>  
            <binding portSharingEnabled="true">  
              <security mode="None" />  
            </binding>  
          </netTcpBinding>  
        </bindings>  
      </system.serviceModel>  
    </configuration>  
    
  4. Erstellen Sie eine Service.svc-Datei, die den folgenden Code enthält.Create a Service.svc file that contains the following code.

    <%@ServiceHost language=c# Service="CalculatorService" %>   
    
  5. Stellen Sie die Service.svc-Datei in das virtuelle IIS-Verzeichnis.Place the Service.svc file in your IIS virtual directory.

So erstellen Sie einen Client, der den Dienst verwendetTo create a client to use the service

  1. Verwendung ServiceModel Metadata Utility Tool (Svcutil.exe) über die Befehlszeile, um Code von Dienstmetadaten zu generieren.Use ServiceModel Metadata Utility Tool (Svcutil.exe) from the command line to generate code from service metadata.

    Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address>   
    
  2. Der generierte Client enthält die ICalculator-Schnittstelle, die den Dienstvertrag definiert, dem die Clientimplementierung entsprechen muss.The client that is generated contains the ICalculator interface that defines the service contract that the client implementation must satisfy.

       //Generated interface defining the ICalculator contract	
       [System.ServiceModel.ServiceContractAttribute(
       Namespace="http://Microsoft.ServiceModel.Samples", ConfigurationName="Microsoft.ServiceModel.Samples.ICalculator")]
       public interface ICalculator
       {
           
           [System.ServiceModel.OperationContractAttribute(
    Action="http://Microsoft.ServiceModel.Samples/ICalculator/Add", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/AddResponse")]
           double Add(double n1, double n2);
           
           	[System.ServiceModel.OperationContractAttribute(
    Action="http://Microsoft.ServiceModel.Samples/ICalculator/Subtract", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/SubtractResponse")]
           double Subtract(double n1, double n2);
           
           	[System.ServiceModel.OperationContractAttribute(
    Action="http://Microsoft.ServiceModel.Samples/ICalculator/Multiply", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/MultiplyResponse")]
           double Multiply(double n1, double n2);
           
           	[System.ServiceModel.OperationContractAttribute(
    Action="http://Microsoft.ServiceModel.Samples/ICalculator/Divide", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/DivideResponse")]
           double Divide(double n1, double n2);
       }
    
  3. Die generierte Clientanwendung enthält außerdem die Implementierung von ClientCalculator.The generated client application also contains the implementation of the ClientCalculator. Beachten Sie, dass die Adresse und die Bindungsinformationen in der Implementierung des Diensts nirgendwo angegeben werden.Note that the address and binding information is not specified anywhere inside the implementation of the service. Es muss auch kein Code geschrieben werden, um Informationen aus der Konfigurationsdatei abzurufen.Also, code does not have to be written to retrieve that information from the configuration file.

    // Implementation of the CalculatorClient
    public partial class CalculatorClient : System.ServiceModel.ClientBase<Microsoft.ServiceModel.Samples.ICalculator>, Microsoft.ServiceModel.Samples.ICalculator
    {
        
        public CalculatorClient()
        {
        }
        
        public CalculatorClient(string endpointConfigurationName) : 
                base(endpointConfigurationName)
        {
        }
        
        public CalculatorClient(string endpointConfigurationName, string remoteAddress) : 
                base(endpointConfigurationName, remoteAddress)
        {
        }
        
        public CalculatorClient(string endpointConfigurationName, 
    System.ServiceModel.EndpointAddress remoteAddress) : 
                base(endpointConfigurationName, remoteAddress)
        {
        }
        
        public CalculatorClient(System.ServiceModel.Channels.Binding binding, 				System.ServiceModel.EndpointAddress remoteAddress) : 
                base(binding, remoteAddress)
        {
        }
        
        public double Add(double n1, double n2)
        {
            return base.Channel.Add(n1, n2);
        }
        
        public double Subtract(double n1, double n2)
        {
            return base.Channel.Subtract(n1, n2);
        }
        
        public double Multiply(double n1, double n2)
        {
            return base.Channel.Multiply(n1, n2);
        }
        
        public double Divide(double n1, double n2)
        {
            return base.Channel.Divide(n1, n2);
        }
    }
    
  4. Svcutil.exe generiert auch die Konfiguration für den Client, der NetTcpBinding verwendet.The configuration for the client that uses the NetTcpBinding is also generated by Svcutil.exe. Wenn Sie Visual Studio verwenden, sollte diese Datei in der Datei App.config genannt werden.This file should be named in the App.config file when using Visual Studio.

    
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <system.serviceModel> 
            <bindings> 
                <netTcpBinding> 
                    <binding name="NetTcpBinding_ICalculator"> 
                        <security mode="None"/> 
                    </binding> 
                </netTcpBinding> 
            </bindings> 
            <client> 
                <endpoint 
                  address="net.tcp://localhost/servicemodelsamples/service.svc" 
                  binding="netTcpBinding" bindingConfiguration="NetTcpBinding_ICalculator" 
                  contract="ICalculator" name="NetTcpBinding_ICalculator" /> 
            </client>
        </system.serviceModel> 
    </configuration>
    
    
  5. Erstellen Sie eine Instanz von ClientCalculator in einer Anwendung, und rufen Sie dann die Dienstvorgänge auf.Create an instance of the ClientCalculator in an application and then call the service operations.

    //Client implementation code.
    class Client
    {
        static void Main()
        {
            // Create a client with given client endpoint configuration
            CalculatorClient client = new CalculatorClient();
    
            // Call the Add service operation.
            double value1 = 100.00D;
            double value2 = 15.99D;
            double result = client.Add(value1, value2);
            Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
    
            // Call the Subtract service operation.
            value1 = 145.00D;
            value2 = 76.54D;
            result = client.Subtract(value1, value2);
            Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);
    
            // Call the Multiply service operation.
            value1 = 9.00D;
            value2 = 81.25D;
            result = client.Multiply(value1, value2);
            Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);
    
            // Call the Divide service operation.
            value1 = 22.00D;
            value2 = 7.00D;
            result = client.Divide(value1, value2);
            Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result);
    
            //Closing the client gracefully closes the connection and cleans up resources
            client.Close();
    
            Console.WriteLine();
            Console.WriteLine("Press <ENTER> to terminate client.");
            Console.ReadLine();
        }
    }
    
  6. Kompilieren Sie den Code, und führen Sie den Client aus.Compile and run the client.

Siehe auchSee Also

TCP-AktivierungTCP Activation
Windows Server AppFabric-HostingfunktionenWindows Server App Fabric Hosting Features