Sdílet prostřednictvím


Postupy: Hostování služby WCF ve WAS

Toto téma popisuje základní kroky potřebné k vytvoření služby Windows Process Activation Services (označované také jako WAS) hostované službou Windows Communication Foundation (WCF). WAS je nová aktivační služba procesu, která je generalizací funkcí Internetová informační služba (IIS), které pracují s přenosovými protokoly bez HTTP. WCF používá rozhraní adaptéru naslouchacího procesu ke komunikaci žádostí o aktivaci přijatých prostřednictvím protokolů jiných než HTTP podporovaných wcf, jako jsou TCP, pojmenované kanály a řízení front zpráv.

Tato možnost hostování vyžaduje, aby byly správně nainstalovány a nakonfigurovány součásti aktivace WAS, ale nevyžaduje zápis hostitelského kódu jako součást aplikace. Další informace o instalaci a konfiguraci WAS naleznete v tématu Postupy: Instalace a konfigurace aktivačních komponent WCF.

Upozorňující

Aktivace WAS není podporována, pokud je kanál zpracování požadavků webového serveru nastavený na klasický režim. Kanál zpracování požadavků webového serveru musí být nastavený na integrovaný režim, pokud se má použít aktivace WAS.

Pokud je služba WCF hostovaná ve was, standardní vazby se používají obvyklým způsobem. Při použití NetTcpBindingNetNamedPipeBinding a konfiguraci služby WAS hostované ale musí být splněno omezení. Pokud různé koncové body používají stejný přenos, musí se nastavení vazby shodovat s následujícími sedmi vlastnostmi:

  • Připojení ionBufferSize

  • ChannelInitializationTimeout

  • MaxPending Připojení ions

  • MaxOutputDelay

  • MaxPendingAccepts

  • Připojení ionPool Nastavení. Idletimeout

  • Připojení ionPool Nastavení. MaxOutbound Připojení ionsPerEndpoint

Jinak koncový bod, který je inicializován jako první, vždy určuje hodnoty těchto vlastností a koncové body přidané později vyvolá ServiceActivationException výjimku, pokud neodpovídají těmto nastavením.

Zdrojová kopie tohoto příkladu naleznete v tématu Aktivace TCP.

Vytvoření základní služby hostované službou WAS

  1. Definujte kontrakt služby pro typ služby.

    [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. Implementujte kontrakt služby ve třídě služby. Všimněte si, že v implementaci služby není zadána adresa nebo informace o vazbě. Kód také nemusí být zapsán pro načtení informací z konfiguračního souboru.

    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. Vytvořte soubor Web.config, který definuje NetTcpBinding vazbu, kterou budou koncové body používat CalculatorService .

    <?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. Vytvořte soubor Service.svc, který obsahuje následující kód.

    <%@ServiceHost language=c# Service="CalculatorService" %>
    
  5. Umístěte soubor Service.svc do virtuálního adresáře služby IIS.

Vytvoření klienta pro použití služby

  1. Pomocí nástroje ServiceModel Metadata Utility (Svcutil.exe) z příkazového řádku vygenerujte kód z metadat služby.

    Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address>
    
  2. Klient, který je vygenerován, obsahuje ICalculator rozhraní, které definuje kontrakt služby, který musí implementace klienta splňovat.

    //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. Vygenerovaná klientská aplikace obsahuje také implementaci ClientCalculator. Všimněte si, že adresa a informace o vazbě nejsou zadány nikde uvnitř implementace služby. Kód také nemusí být zapsán pro načtení informací z konfiguračního souboru.

    // 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. Konfigurace pro klienta, který používá, NetTcpBinding je také generována Svcutil.exe. Tento soubor by měl být pojmenován v souboru App.config při použití sady 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. Vytvořte instanci ClientCalculator aplikace a pak volejte operace služby.

    //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. Zkompilujte a spusťte klienta.

Viz také