Udostępnij za pośrednictwem


Instrukcje: Hostowanie usługi WCF w usłudze WAS

W tym temacie opisano podstawowe kroki wymagane do utworzenia usługi aktywacji procesów systemu Windows (znanej również jako WAS) hostowanej usługi Windows Communication Foundation (WCF). WAS to nowa usługa aktywacji procesów, która jest uogólnienie funkcji internetowych usług informacyjnych (IIS), które działają z protokołami transportu innych niż HTTP. WCF używa interfejsu karty odbiornika do przekazywania żądań aktywacji, które są odbierane za pośrednictwem protokołów innych niż HTTP obsługiwanych przez program WCF, takich jak TCP, nazwane potoki i kolejkowanie komunikatów.

Ta opcja hostingu wymaga prawidłowego zainstalowania i skonfigurowania składników aktywacji WAS, ale nie wymaga pisania żadnego kodu hostingu w ramach aplikacji. Aby uzyskać więcej informacji na temat instalowania i konfigurowania programu WAS, zobacz How to: Install and Configure WCF Activation Components (Instrukcje: instalowanie i konfigurowanie składników aktywacji WCF).

Ostrzeżenie

Aktywacja WAS nie jest obsługiwana, jeśli potok przetwarzania żądań serwera internetowego jest ustawiony na tryb klasyczny. Potok przetwarzania żądań serwera internetowego musi być ustawiony na tryb zintegrowany, jeśli ma być używana aktywacja WAS.

Gdy usługa WCF jest hostowana w usłudze WAS, standardowe powiązania są używane w zwykły sposób. Jednak w przypadku używania NetTcpBinding elementu i NetNamedPipeBinding do konfigurowania usługi hostowanej przez was ograniczenie musi być spełnione. Gdy różne punkty końcowe używają tego samego transportu, ustawienia powiązania muszą być zgodne z następującymi siedmioma właściwościami:

  • Połączenie ionBufferSize

  • ChannelInitializationTimeout

  • MaxPending Połączenie ions

  • MaxOutputDelay

  • Maxpendingaccepts

  • Połączenie ionPool Ustawienia. Idletimeout

  • Połączenie ionPool Ustawienia. MaxOutbound Połączenie ionsPerEndpoint

W przeciwnym razie punkt końcowy, który jest inicjowany jako pierwszy, zawsze określa wartości tych właściwości, a dodane punkty końcowe później zgłaszają wartość ServiceActivationException , jeśli nie są zgodne z tymi ustawieniami.

Aby uzyskać kopię źródłową tego przykładu, zobacz Aktywacja TCP.

Aby utworzyć podstawową usługę hostowaną przez usługę WAS

  1. Zdefiniuj kontrakt usługi dla typu usługi.

    [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. Zaimplementuj kontrakt usługi w klasie usługi. Należy pamiętać, że informacje o adresach lub powiązaniach nie są określone wewnątrz implementacji usługi. Ponadto kod nie musi być zapisywany w celu pobrania tych informacji z pliku konfiguracji.

    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. Utwórz plik Web.config, aby zdefiniować NetTcpBinding powiązanie, które ma być używane przez CalculatorService punkty końcowe.

    <?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. Utwórz plik Service.svc zawierający następujący kod.

    <%@ServiceHost language=c# Service="CalculatorService" %>
    
  5. Umieść plik Service.svc w katalogu wirtualnym usług IIS.

Aby utworzyć klienta do korzystania z usługi

  1. Użyj narzędzia ServiceModel Metadata Tool (Svcutil.exe) z wiersza polecenia, aby wygenerować kod na podstawie metadanych usługi.

    Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address>
    
  2. Wygenerowany klient zawiera ICalculator interfejs definiujący kontrakt usługi, który musi spełniać implementacja klienta.

    //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. Wygenerowana aplikacja kliencka zawiera również implementację .ClientCalculator Należy pamiętać, że informacje o adresie i powiązaniu nie są określone w żadnym miejscu wewnątrz implementacji usługi. Ponadto kod nie musi być zapisywany w celu pobrania tych informacji z pliku konfiguracji.

    // 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. Konfiguracja klienta korzystającego z programu NetTcpBinding jest również generowana przez Svcutil.exe. Ten plik powinien mieć nazwę w pliku App.config podczas korzystania z programu 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. Utwórz wystąpienie ClientCalculator klasy w aplikacji, a następnie wywołaj operacje usługi.

    //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. Skompiluj i uruchom klienta.

Zobacz też