چگونگی میزبانی و اجرای یک basic Windows Communication Foundation یا (WCF)
این مقاله سومین مرحله از شش مرحله ای است که باید برای ایجاد یک سرویس Windows Communication Foundation یا (WCF) و یک client که سرویس را فراخوانی می کند، انجام داد.
این مقاله، چگونگی اجرای یک سرویس basic Windows Communication Foundation یا (WCF) را توصیف می کند. این فرآیند شامل مراحل زیر است:
- ایجاد یک ادرس پایه ای برای سرویس
- ایجاد یک میزبان برای سرویس
- فعال سازی مبادله فراداده ها
- باز کردن میزبانی سرویس
لیست کاملی از کدهایی که باید در این مرحله نوشته شوند، در مثال زیر آورده شده است. کد زیر را به متد Main() که در کلاس Program تعریف شده، اضافه کنید. این کلاس هنگامی که شما راه حل Service را ایجاد کردید، generate شده است.
پیکر بندی آدرس پایه (base address) برای سرویس
- یک نمونه Uri برای آدرس پایه ای سرویس ایجاد کنیم. این URI، سیستم محلی شما، پورت شماره 8000، HTTP scheme و مسیر ServiceModelSample/Service را به سرویسی که برای فضای نامی سرویس در service contract معین شده، تعیین می کند.
در VB
در#C
Uri baseAddress = new Uri("http://localhost:8000/ServiceModelSamples/Service");
میزبانی سرویس
1. فضای نامی System.ServiceModel.Description را import کنید. این کد باید در بالای فایل Program.cs/Program.vb با بقیه عبارات using یا imports، قرار گیرد.
در VB
Imports System.ServiceModel.Description
در#C
using System.ServiceModel.Description;
2. نمونه ای جدید از ServiceHost برای میزبانی سرویس ایجاد کنید. باید typeیی را که service contract و base address را پیاده سازی می کند، تعیین کنید. آدرس پایه ای این نمونه، http://localhost:8000/ServiceModelSamples/Service است، و CalculatorService، تایپی است که service contract را پیاده سازی می کند.
در VB
Dim selfHost As New ServiceHost(GetType(CalculatorService), baseAddress)
در#C
ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);
3. یک عبارت try-catch اضافه کنید که CommunicationException را catch می کند و کد را در سه مرحله بعدی اضافه کنید و block را try کنید. کلمه catch، باید یک پیام error نمایش دهد، سپس selfHost.Abort() را فراخوانی کنید.
در VB
Try
' ...
Catch ce As CommunicationException
Console.WriteLine("An exception occurred: {0}", ce.Message)
selfHost.Abort()
End Try
در#C
try
{
// ...
}
catch (CommunicationException ce)
{
Console.WriteLine("An exception occurred: {0}", ce.Message);
selfHost.Abort();
}
4. یک endpoint اضافه کنید که سرویس را expose کند. برای انجام این کار، باید contractیی را که endpoint در حال expose کردن است، تعیین کنید. برای این نمونه، ICalculator را به عنوان contract، WSHttpBinding را به عنوان binding، و CalculatorService را به عنوان آدرس تعیین کنید. توجه داشته باشید که در اینجا آدرس endpoint، یک آدرس رابطه ای است. آدرس کامل endpoint، ترکیبی از آدرس پایه ای و آدرس endpoint است. در این مورد، آدرس کامل http://localhost:8000/ServiceModelSamples/Service/CalculatorService است.
در VB
' Add a service endpoint
selfHost.AddServiceEndpoint( _
GetType(ICalculator), _
New WSHttpBinding(), _
"CalculatorService")
در#C
selfHost.AddServiceEndpoint(
typeof(ICalculator),
new WSHttpBinding(),
"CalculatorService");
5. تبادل فرا داده ها را فعال کنید. برای انجام این کار، یک service metadata behavior اضافه کنید. ابتدا یک نمونه از ServiceMetadataBehavior ایجاد کنید، HttpGetEnabled را روی true تنظیم کنید، و سپس behavior جدید به سرویس اضافه کنید.
در VB
' Enable metadata exchange
Dim smb As New ServiceMetadataBehavior()
smb.HttpGetEnabled = True
selfHost.Description.Behaviors.Add(smb)
در#C
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
selfHost.Description.Behaviors.Add(smb);
6. ServiceHost را باز کنید و منتظر پیامهای دریافتی بمانید. هنگامی که کاربر دکمه enter را می زند، ServiceHost را ببندید.
در VB
selfHost.Open()
Console.WriteLine("The service is ready.")
Console.WriteLine("Press <ENTER> to terminate service.")
Console.WriteLine()
Console.ReadLine()
' Close the ServiceHostBase to shutdown the service.
selfHost.Close()
در#C
selfHost.Open();
Console.WriteLine("The service is ready.");
Console.WriteLine("Press <ENTER> to terminate service.");
Console.WriteLine();
Console.ReadLine();
// Close the ServiceHostBase to shutdown the service.
selfHost.Close();
تایید کار کردن سرویس
1. service.exe را از داخل Visual Studio اجرا کنید. زمان اجرا روی ویندوز ویستا، سرویس باید با اجازه مدیر (administrator) اجرا شود. زیرا Visual Studio و service.exe با اجازه مدیر اجرا می شوند. می توانید با اجازه مدیر، یک command prompt جدید باز کنید و service.exe را درون آن اجرا کنید.
2. Internet Explorer را باز کنید و به صفحه دیباگ سرویس به آدرس http://localhost:8000/ServiceModelSamples/Service بروید.
مثال
مثال زیر، شامل service contract و پیاده ساری آن از مرحله قبلی می باشد، و سرویس را در یک console application میزبانی می کند.
در VB
Imports System
Imports System.ServiceModel
Imports System.ServiceModel.Description
Module Service
' Define a service contract.
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples")> _
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
' Service class that implements the service contract.
' Added code to write output to the console window.
Public Class CalculatorService
Implements ICalculator
Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Add
Dim result As Double = n1 + n2
Console.WriteLine("Received Add({0},{1})", n1, n2)
Console.WriteLine("Return: {0}", result)
Return result
End Function
Public Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Subtract
Dim result As Double = n1 - n2
Console.WriteLine("Received Subtract({0},{1})", n1, n2)
Console.WriteLine("Return: {0}", result)
Return result
End Function
Public Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Multiply
Dim result As Double = n1 * n2
Console.WriteLine("Received Multiply({0},{1})", n1, n2)
Console.WriteLine("Return: {0}", result)
Return result
End Function
Public Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Divide
Dim result As Double = n1 / n2
Console.WriteLine("Received Divide({0},{1})", n1, n2)
Console.WriteLine("Return: {0}", result)
Return result
End Function
End Class
Class Program
Shared Sub Main()
' Step 1 of the address configuration procedure: Create a URI to serve as the base address.
Dim baseAddress As New Uri("http://localhost:8000/ServiceModelSamples/Service")
' Step 2 of the hosting procedure: Create ServiceHost
Dim selfHost As New ServiceHost(GetType(CalculatorService), baseAddress)
Try
' Step 3 of the hosting procedure: Add a service endpoint.
' Add a service endpoint
selfHost.AddServiceEndpoint( _
GetType(ICalculator), _
New WSHttpBinding(), _
"CalculatorService")
' Step 4 of the hosting procedure: Enable metadata exchange.
' Enable metadata exchange
Dim smb As New ServiceMetadataBehavior()
smb.HttpGetEnabled = True
selfHost.Description.Behaviors.Add(smb)
' Step 5 of the hosting procedure: Start (and then stop) the service.
selfHost.Open()
Console.WriteLine("The service is ready.")
Console.WriteLine("Press <ENTER> to terminate service.")
Console.WriteLine()
Console.ReadLine()
' Close the ServiceHostBase to shutdown the service.
selfHost.Close()
Catch ce As CommunicationException
Console.WriteLine("An exception occurred: {0}", ce.Message)
selfHost.Abort()
End Try
End Sub
End Class
در#C
using System;
using System.ServiceModel;
using System.ServiceModel.Description;
namespace Microsoft.ServiceModel.Samples
{
// Define a service contract.
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
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);
}
// Service class that implements the service contract.
// Added code to write output to the console window.
public class CalculatorService : ICalculator
{
public double Add(double n1, double n2)
{
double result = n1 + n2;
Console.WriteLine("Received Add({0},{1})", n1, n2);
Console.WriteLine("Return: {0}", result);
return result;
}
public double Subtract(double n1, double n2)
{
double result = n1 - n2;
Console.WriteLine("Received Subtract({0},{1})", n1, n2);
Console.WriteLine("Return: {0}", result);
return result;
}
public double Multiply(double n1, double n2)
{
double result = n1 * n2;
Console.WriteLine("Received Multiply({0},{1})", n1, n2);
Console.WriteLine("Return: {0}", result);
return result;
}
public double Divide(double n1, double n2)
{
double result = n1 / n2;
Console.WriteLine("Received Divide({0},{1})", n1, n2);
Console.WriteLine("Return: {0}", result);
return result;
}
}
class Program
{
static void Main(string[] args)
{
// Step 1 of the address configuration procedure: Create a URI to serve as the base address.
Uri baseAddress = new Uri("http://localhost:8000/ServiceModelSamples/Service");
// Step 2 of the hosting procedure: Create ServiceHost
ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);
try
{
// Step 3 of the hosting procedure: Add a service endpoint.
selfHost.AddServiceEndpoint(
typeof(ICalculator),
new WSHttpBinding(),
"CalculatorService");
// Step 4 of the hosting procedure: Enable metadata exchange.
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
selfHost.Description.Behaviors.Add(smb);
// Step 5 of the hosting procedure: Start (and then stop) the service.
selfHost.Open();
Console.WriteLine("The service is ready.");
Console.WriteLine("Press <ENTER> to terminate service.");
Console.WriteLine();
Console.ReadLine();
// Close the ServiceHostBase to shutdown the service.
selfHost.Close();
}
catch (CommunicationException ce)
{
Console.WriteLine("An exception occurred: {0}", ce.Message);
selfHost.Abort();
}
}
}
}
الان سرویس در حال اجراست.