Share via


Nasıl yapılır: WAS'ta WCF Hizmeti Barındırma

Bu konu başlığı altında, barındırılan bir Windows Communication Foundation (WCF) hizmeti oluşturmak için gereken temel adımlar özetlenmektedir. WAS, HTTP dışı aktarım protokolleriyle çalışan Internet Information Services (IIS) özelliklerinin genelleştirilmesi olan yeni işlem etkinleştirme hizmetidir. WCF, TCP, adlandırılmış kanallar ve Message Queuing gibi WCF tarafından desteklenen HTTP dışı protokoller üzerinden alınan etkinleştirme isteklerini iletmek için dinleyici bağdaştırıcısı arabirimini kullanır.

Bu barındırma seçeneği WAS etkinleştirme bileşenlerinin düzgün şekilde yüklenmesini ve yapılandırılmasını gerektirir, ancak uygulamanın bir parçası olarak herhangi bir barındırma kodunun yazılması gerekmez. WAS'yi yükleme ve yapılandırma hakkında daha fazla bilgi için bkz . Nasıl yapılır: WCF Etkinleştirme Bileşenlerini Yükleme ve Yapılandırma.

Uyarı

Web sunucusunun istek işleme işlem hattı Klasik moda ayarlandıysa WAS etkinleştirmesi desteklenmez. WAS etkinleştirmesi kullanılacaksa web sunucusunun istek işleme işlem hattı Tümleşik moda ayarlanmalıdır.

BIR WCF hizmeti WAS'de barındırıldığında standart bağlamalar her zamanki gibi kullanılır. Ancak, was tarafından barındırılan NetTcpBindingNetNamedPipeBinding bir hizmeti yapılandırmak için ve kullanılırken bir kısıtlamanın karşılanması gerekir. Farklı uç noktalar aynı taşımayı kullandığında, bağlama ayarlarının aşağıdaki yedi özellikte eşleşmesi gerekir:

  • Bağlan ionBufferSize

  • ChannelInitializationTimeout

  • MaxPending Bağlan ions

  • MaxOutputDelay

  • MaxPendingAccepts

  • Bağlan ionPool Ayarlar. Idletimeout

  • Bağlan ionPool Ayarlar. MaxOutbound Bağlan ionsPerEndpoint

Aksi takdirde, ilk olarak başlatılan uç nokta her zaman bu özelliklerin değerlerini belirler ve daha sonra eklenen uç noktalar bu ayarlarla eşleşmezse bir ServiceActivationException oluşturur.

Bu örneğin kaynak kopyası için bkz . TCP Etkinleştirme.

WAS tarafından barındırılan temel bir hizmet oluşturmak için

  1. Hizmet türü için bir hizmet sözleşmesi tanımlayın.

    [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. Hizmet sözleşmesini bir hizmet sınıfında uygulayın. Adres veya bağlama bilgilerinin hizmetin uygulamasında belirtilmediğini unutmayın. Ayrıca, yapılandırma dosyasından bu bilgileri almak için kodun yazılması gerekmez.

    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. Uç noktalar tarafından CalculatorService kullanılacak bağlamayı NetTcpBinding tanımlamak için bir Web.config dosyası oluşturun.

    <?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. Aşağıdaki kodu içeren bir Service.svc dosyası oluşturun.

    <%@ServiceHost language=c# Service="CalculatorService" %>
    
  5. Service.svc dosyasını IIS sanal dizininize yerleştirin.

Hizmeti kullanmak üzere bir istemci oluşturmak için

  1. Hizmet meta verilerinden kod oluşturmak için komut satırından ServiceModel Meta Veri Yardımcı Programı Aracı'nı (Svcutil.exe) kullanın.

    Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address>
    
  2. Oluşturulan istemci, istemci uygulamasının karşılaması ICalculator gereken hizmet sözleşmesini tanımlayan arabirimi içerir.

    //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. Oluşturulan istemci uygulaması da uygulamasını ClientCalculatoriçerir. Adres ve bağlama bilgilerinin hizmetin uygulanması içinde herhangi bir yerde belirtilmediğini unutmayın. Ayrıca, yapılandırma dosyasından bu bilgileri almak için kodun yazılması gerekmez.

    // 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. kullanan istemcinin NetTcpBinding yapılandırması da Svcutil.exe tarafından oluşturulur. Visual Studio kullanılırken bu dosya App.config dosyasında adlandırılmalıdır.

    
    <?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. Bir uygulamada öğesinin ClientCalculator bir örneğini oluşturun ve ardından hizmet işlemlerini çağırın.

    //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. İstemciyi derleyin ve çalıştırın.

Ayrıca bkz.