Bagikan melalui


Cara: Meng-hosting Layanan WCF di WAS

Topik ini menguraikan langkah-langkah dasar yang diperlukan untuk membuat layanan Windows Process Activation Services (juga dikenal sebagai WAS) yang dihosting Windows Communication Foundation (WCF). WAS adalah layanan aktivasi proses baru yang merupakan generalisasi fitur Layanan Informasi Internet (IIS) yang berfungsi dengan protokol transportasi non-HTTP. WCF menggunakan antarmuka adaptor pendengar untuk mengomunikasikan permintaan aktivasi yang diterima melalui protokol non-HTTP yang didukung oleh WCF, seperti TCP, pipa yang dinamai, dan Message Queuing.

Opsi hosting ini mengharuskan komponen aktivasi WAS diinstal dan dikonfigurasi dengan benar, tetapi tidak memerlukan kode hosting untuk ditulis sebagai bagian dari aplikasi. Untuk informasi selengkapnya tentang menginstal dan mengonfigurasi WAS, lihat Cara: Menginstal dan Mengonfigurasi Komponen Aktivasi WCF.

Peringatan

Aktivasi WAS tidak didukung jika alur pemrosesan permintaan server web diatur ke mode Klasik. Alur pemrosesan permintaan server web harus diatur ke mode Terintegrasi jika aktivasi WAS akan digunakan.

Ketika layanan WCF dihosting di WAS, pengikatan standar digunakan dengan cara yang biasa. Namun, saat menggunakan NetTcpBinding dan NetNamedPipeBinding untuk mengonfigurasi layanan yang dihosting WAS, batasan harus dipenuhi. Ketika titik akhir yang berbeda menggunakan transportasi yang sama, pengaturan pengikatan harus cocok dengan tujuh properti berikut:

  • ConnectionBufferSize

  • ChannelInitializationTimeout

  • MaxPendingConnections

  • MaxOutputDelay

  • MaxPendingAccepts

  • ConnectionPoolSettings.IdleTimeout

  • ConnectionPoolSettings.MaxOutboundConnectionsPerEndpoint

Jika tidak, titik akhir yang diinisialisasi terlebih dahulu selalu menentukan nilai properti ini, dan titik akhir yang ditambahkan kemudian akan melempar ServiceActivationException jika tidak cocok dengan pengaturan tersebut.

Untuk salinan sumber contoh ini, lihat Aktivasi TCP.

Untuk membuat layanan dasar yang dihosting oleh WAS

  1. Tentukan kontrak layanan untuk jenis layanan.

    [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. Implementasikan kontrak layanan di kelas layanan. Perhatikan bahwa Informasi alamat atau pengikatan tidak ditentukan di dalam implementasi layanan. Selain itu, kode tidak harus ditulis untuk mengambil informasi tersebut dari file konfigurasi.

    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. Buat file Web.config untuk menentukan pengikatan NetTcpBinding yang akan digunakan oleh titik akhir 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. Buat file Service.svc yang berisi kode berikut.

    <%@ServiceHost language=c# Service="CalculatorService" %>
    
  5. Tempatkan file Service.svc di direktori virtual IIS Anda.

Untuk membuat klien untuk menggunakan layanan

  1. Gunakan ServiceModel Metadata Utility Tool (Svcutil.exe) dari baris perintah untuk membuat kode dari metadata layanan.

    Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address>
    
  2. Klien yang dihasilkan berisi antarmuka ICalculator yang menentukan kontrak layanan yang harus dipenuhi oleh implementasi klien.

    //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. Aplikasi klien yang dihasilkan juga berisi implementasi ClientCalculator. Perhatikan bahwa alamat dan informasi pengikatan tidak ditentukan di mana pun di dalam implementasi layanan. Selain itu, kode tidak harus ditulis untuk mengambil informasi tersebut dari file konfigurasi.

    // 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. Konfigurasi untuk klien yang menggunakan NetTcpBinding juga dibuat dengan Svcutil.exe. File ini harus dinamai dalam file App.config saat menggunakan 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. Buat instans ClientCalculator dalam aplikasi kemudian panggil operasi layanan.

    //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. Membangun dan menjalankan klien.

Lihat juga