Cara: Menghosting Layanan WCF di IIS
Topik ini menguraikan langkah-langkah dasar yang diperlukan untuk membuat layanan Windows Communication Foundation (WCF) yang dihosting di Layanan Informasi Internet (IIS). Topik ini mengasumsikan bahwa Anda terbiasa dengan IIS dan memahami cara menggunakan alat manajemen IIS untuk membuat dan mengelola aplikasi IIS. Untuk informasi selengkapnya tentang IIS lihat Layanan Informasi Internet. Layanan WCF yang berjalan di lingkungan IIS memanfaatkan sepenuhnya fitur IIS, seperti daur ulang proses, matikan mode diam, pemantauan kesehatan proses, dan aktivasi berbasis pesan. Opsi hosting ini mengharuskan IIS dikonfigurasi dengan benar, tetapi tidak mengharuskan kode hosting ditulis sebagai bagian dari aplikasi. Anda dapat menggunakan hosting IIS hanya dengan transportasi HTTP.
Untuk informasi selengkapnya tentang bagaimana WCF dan ASP.NET berinteraksi, lihat Layanan dan ASP.NET WCF. Untuk informasi selengkapnya tentang mengonfigurasi keamanan, lihat Keamanan.
Untuk salinan sumber contoh ini, lihat IIS Hosting Menggunakan Kode Sebaris.
Untuk membuat layanan yang dihosting oleh IIS
Konfirmasikan bahwa IIS terpasang dan berjalan di komputer Anda. Untuk informasi selengkapnya tentang memasang dan mengonfigurasi IIS, lihat Memasang dan Mengonfigurasi IIS 7.0
Buat folder baru untuk file aplikasi Anda yang disebut "IISHostedCalcService", pastikan bahwa ASP.NET memiliki akses ke konten folder, dan gunakan alat manajemen IIS untuk membuat aplikasi IIS baru yang secara fisik terletak di direktori aplikasi ini. Saat membuat alias untuk direktori aplikasi, gunakan "IISHostedCalc".
Buat file baru bernama “service.svc” dalam direktori aplikasi. Edit file ini dengan menambahkan elemen berikut @ServiceHost.
<%@ServiceHost language=c# Debug="true" Service="Microsoft.ServiceModel.Samples.CalculatorService"%>
Buat subdirektori App_Code dalam direktori aplikasi.
Buat file kode bernama Service.cs di subdirektori App_Code.
Tambahkan arahan berikut
using
ke bagian atas file Service.cs.using System; using System.ServiceModel;
Tambahkan deklarasi namespace berikut setelah direktif
using
.namespace Microsoft.ServiceModel.Samples { }
Tentukan kontrak layanan di dalam deklarasi namespace seperti yang ditunjukkan dalam kode berikut.
[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); }
<ServiceContract()> _ Public Interface ICalculator <OperationContract()> _ Function Add(ByVal n1 As Double, _ ByVal n2 As Double) As Double <OperationContract()> _ Function Subtract(ByVal n1 As Double, _ ByVal n2 As Double) As Double <OperationContract()> _ Function Multiply(ByVal n1 As Double, _ ByVal n2 As Double) As Double <OperationContract()> _ Function Divide(ByVal n1 As Double, _ ByVal n2 As Double) As Double End Interface
Terapkan kontrak layanan setelah definisi kontrak layanan seperti yang ditunjukkan dalam kode berikut.
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; } }
Public Class CalculatorService Implements ICalculator Public Function Add(ByVal n1 As Double, _ ByVal n2 As Double) As Double Implements ICalculator.Add Return n1 + n2 End Function Public Function Subtract(ByVal n1 As Double, _ ByVal n2 As Double) As Double Implements ICalculator.Subtract Return n1 - n2 End Function Public Function Multiply(ByVal n1 As Double, _ ByVal n2 As Double) As Double Implements ICalculator.Multiply Return n1 * n2 End Function Public Function Divide(ByVal n1 As Double, _ ByVal n2 As Double) As Double Implements ICalculator.Divide Return n1 / n2 End Function End Class
Buat file bernama "Web.config" di direktori aplikasi dan tambahkan kode konfigurasi berikut ke dalam file. Pada durasi, infrastruktur WCF menggunakan informasi untuk membangun titik akhir yang dapat dikomunikasikan oleh aplikasi klien.
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <services> <service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="CalculatorServiceBehaviors"> <!-- This endpoint is exposed at the base address provided by host: http://localhost/servicemodelsamples/service.svc --> <endpoint address="" binding="wsHttpBinding" contract="Microsoft.ServiceModel.Samples.ICalculator" /> <!-- The mex endpoint is exposed at http://localhost/servicemodelsamples/service.svc/mex --> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> </services> <behaviors> <serviceBehaviors> <behavior name="CalculatorServiceBehaviors"> <!-- Add the following element to your service behavior configuration. --> <serviceMetadata httpGetEnabled="true" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
Contoh ini secara eksplisit menentukan titik akhir dalam file konfigurasi. Jika Anda tidak menambahkan titik akhir apa pun ke layanan, runtime bahasa umum menambahkan titik akhir default untuk Anda. Untuk informasi selengkapnya tentang titik akhir, pengikatan, dan perilaku default, lihat Konfigurasi Sederhana dan Konfigurasi Sederhana untuk Layanan WCF.
Untuk memastikan layanan dihosting dengan benar, buka browser dan telusuri KE URL layanan:
http://localhost/IISHostedCalc/Service.svc
Contoh
Berikut ini adalah daftar lengkap kode untuk layanan kalkulator yang dihosting IIS.
using System;
using System.ServiceModel;
namespace Microsoft.ServiceModel.Samples
{
[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);
}
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;
}
}
}
Imports System.ServiceModel
Namespace Microsoft.ServiceModel.Samples
<ServiceContract()> _
Public Interface ICalculator
<OperationContract()> _
Function Add(ByVal n1 As Double, _
ByVal n2 As Double) As Double
<OperationContract()> _
Function Subtract(ByVal n1 As Double, _
ByVal n2 As Double) As Double
<OperationContract()> _
Function Multiply(ByVal n1 As Double, _
ByVal n2 As Double) As Double
<OperationContract()> _
Function Divide(ByVal n1 As Double, _
ByVal n2 As Double) As Double
End Interface
Public Class CalculatorService
Implements ICalculator
Public Function Add(ByVal n1 As Double, _
ByVal n2 As Double) As Double Implements ICalculator.Add
Return n1 + n2
End Function
Public Function Subtract(ByVal n1 As Double, _
ByVal n2 As Double) As Double Implements ICalculator.Subtract
Return n1 - n2
End Function
Public Function Multiply(ByVal n1 As Double, _
ByVal n2 As Double) As Double Implements ICalculator.Multiply
Return n1 * n2
End Function
Public Function Divide(ByVal n1 As Double, _
ByVal n2 As Double) As Double Implements ICalculator.Divide
Return n1 / n2
End Function
End Class
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="CalculatorServiceBehaviors">
<!-- This endpoint is exposed at the base address provided by host: http://localhost/servicemodelsamples/service.svc -->
<endpoint address=""
binding="wsHttpBinding"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
<!-- The mex endpoint is exposed at http://localhost/servicemodelsamples/service.svc/mex -->
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorServiceBehaviors">
<!-- Add the following element to your service behavior configuration. -->
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>