Nasıl yapılır: IIS'de WCF Hizmeti Barındırma
Bu konu başlığı altında, Internet Information Services'te (IIS) barındırılan bir Windows Communication Foundation (WCF) hizmeti oluşturmak için gereken temel adımlar özetlenmektedir. Bu konu başlığında, IIS hakkında bilgi sahibi olduğunuz ve IIS uygulamalarını oluşturmak ve yönetmek için IIS yönetim aracını nasıl kullanacağınızı anladığınız varsayılır. IIS hakkında daha fazla bilgi için bkz. Internet Information Services. IIS ortamında çalışan bir WCF hizmeti, işlem geri dönüşümü, boşta kapatma, işlem durumu izleme ve ileti tabanlı etkinleştirme gibi IIS özelliklerinden tam olarak yararlanır. Bu barındırma seçeneği IIS'nin düzgün yapılandırılmasını gerektirir, ancak uygulamanın bir parçası olarak herhangi bir barındırma kodunun yazılması gerekmez. IIS barındırmayı yalnızca bir HTTP aktarımıyla kullanabilirsiniz.
WCF ve ASP.NET etkileşimleri hakkında daha fazla bilgi için bkz . WCF Hizmetleri ve ASP.NET. Güvenliği yapılandırma hakkında daha fazla bilgi için bkz . Güvenlik.
Bu örneğin kaynak kopyası için bkz . Satır içi Kod Kullanarak IIS Barındırma.
IIS tarafından barındırılan bir hizmet oluşturmak için
IIS'nin bilgisayarınızda yüklendiğini ve çalıştığını onaylayın. IIS'yi yükleme ve yapılandırma hakkında daha fazla bilgi için bkz. IIS 7.0'ı Yükleme ve Yapılandırma
Uygulama dosyalarınız için "IISHostedCalcService" adlı yeni bir klasör oluşturun, ASP.NET klasörün içeriğine erişimi olduğundan emin olun ve iis yönetim aracını kullanarak bu uygulama dizininde fiziksel olarak bulunan yeni bir IIS uygulaması oluşturun. Uygulama dizini için bir diğer ad oluştururken "IISHostedCalc" kullanın.
Uygulama dizininde "service.svc" adlı yeni bir dosya oluşturun. Aşağıdaki @ServiceHost öğeyi ekleyerek bu dosyayı düzenleyin.
<%@ServiceHost language=c# Debug="true" Service="Microsoft.ServiceModel.Samples.CalculatorService"%>
Uygulama dizininde bir App_Code alt dizini oluşturun.
App_Code alt dizininde Service.cs adlı bir kod dosyası oluşturun.
aşağıdaki
using
yönergeleri Service.cs dosyasının en üstüne ekleyin.using System; using System.ServiceModel;
Yönergelerin arkasına aşağıdaki ad alanı bildirimini
using
ekleyin.namespace Microsoft.ServiceModel.Samples { }
Aşağıdaki kodda gösterildiği gibi ad alanı bildirimi içinde hizmet sözleşmesini 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); }
<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
Aşağıdaki kodda gösterildiği gibi hizmet sözleşmesi tanımından sonra hizmet sözleşmesini uygulayın.
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
Uygulama dizininde "Web.config" adlı bir dosya oluşturun ve dosyaya aşağıdaki yapılandırma kodunu ekleyin. Çalışma zamanında WCF altyapısı, istemci uygulamalarının iletişim kurabileceği bir uç nokta oluşturmak için bu bilgileri kullanır.
<?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>
Bu örnek, yapılandırma dosyasındaki uç noktaları açıkça belirtir. Hizmete herhangi bir uç nokta eklemezseniz, çalışma zamanı sizin için varsayılan uç noktaları ekler. Varsayılan uç noktalar, bağlamalar ve davranışlar hakkında daha fazla bilgi için bkz. WCF Hizmetleri için Basitleştirilmiş Yapılandırma ve Basitleştirilmiş Yapılandırma.
Hizmetin doğru barındırdığından emin olmak için bir tarayıcı açın ve hizmetin URL'sine göz atın:
http://localhost/IISHostedCalc/Service.svc
Örnek
Iis barındırılan hesap makinesi hizmeti için kodun tam listesi aşağıdadır.
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>