Dela via


Anvisningar: Värd för en WCF-tjänst i WAS

Det här avsnittet beskriver de grundläggande steg som krävs för att skapa en Windows Process Activation Services(även kallad WAS) värdbaserad Windows Communication Foundation-tjänst (WCF). WAS är den nya processaktiveringstjänsten som är en generalisering av IIS-funktioner (Internet Information Services) som fungerar med icke-HTTP-transportprotokoll. WCF använder lyssnarkortets gränssnitt för att kommunicera aktiveringsbegäranden som tas emot via de icke-HTTP-protokoll som stöds av WCF, till exempel TCP, namngivna pipes och Message Queuing.

Det här värdalternativet kräver att WAS-aktiveringskomponenterna är korrekt installerade och konfigurerade, men det kräver inte att någon värdkod skrivs som en del av programmet. Mer information om hur du installerar och konfigurerar WAS finns i Så här installerar och konfigurerar du WCF-aktiveringskomponenter.

Varning

WAS-aktivering stöds inte om webbserverns pipeline för bearbetning av begäranden är inställd på klassiskt läge. Webbserverns pipeline för bearbetning av begäranden måste anges till Integrerat läge om WAS-aktivering ska användas.

När en WCF-tjänst finns i WAS används standardbindningarna på vanligt sätt. Men när du använder NetTcpBinding och NetNamedPipeBinding för att konfigurera en WAS-värdbaserad tjänst måste en begränsning uppfyllas. När olika slutpunkter använder samma transport måste bindningsinställningarna matcha följande sju egenskaper:

  • Anslut ionBufferSize

  • ChannelInitializationTimeout

  • Maxpending Anslut ions

  • MaxOutputDelay

  • MaxPendingAccepts

  • Anslut ionPool Inställningar. IdleTimeout

  • Anslut ionPool Inställningar. MaxOutbound Anslut ionsPerEndpoint

Annars avgör slutpunkten som initieras först alltid värdena för dessa egenskaper, och slutpunkter som läggs till senare genererar en ServiceActivationException om de inte matchar dessa inställningar.

Källkopian av det här exemplet finns i TCP-aktivering.

Så här skapar du en grundläggande tjänst som hanteras av WAS

  1. Definiera ett tjänstkontrakt för typen av tjänst.

    [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. Implementera tjänstkontraktet i en tjänstklass. Observera att adress- eller bindningsinformation inte anges i implementeringen av tjänsten. Dessutom behöver koden inte skrivas för att hämta den informationen från konfigurationsfilen.

    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. Skapa en Web.config-fil för att definiera bindningen NetTcpBinding som ska användas av CalculatorService slutpunkterna.

    <?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. Skapa en Service.svc-fil som innehåller följande kod.

    <%@ServiceHost language=c# Service="CalculatorService" %>
    
  5. Placera Filen Service.svc i din virtuella IIS-katalog.

Så här skapar du en klient för att använda tjänsten

  1. Använd ServiceModel Metadata Utility Tool (Svcutil.exe) från kommandoraden för att generera kod från tjänstens metadata.

    Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address>
    
  2. Klienten som genereras innehåller det ICalculator gränssnitt som definierar tjänstkontraktet som klientimplementeringen måste uppfylla.

    //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. Det genererade klientprogrammet innehåller även implementeringen av ClientCalculator. Observera att adress- och bindningsinformationen inte anges någonstans i implementeringen av tjänsten. Dessutom behöver koden inte skrivas för att hämta den informationen från konfigurationsfilen.

    // 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. Konfigurationen för klienten som använder NetTcpBinding genereras också av Svcutil.exe. Den här filen ska namnges i filen App.config när du använder 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. Skapa en instans av ClientCalculator i ett program och anropa sedan tjänståtgärderna.

    //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. Kompilera och kör klienten.

Se även