چگونگی تعریف یک Windows Communication Foundation Service Contract

ارسال شده توسط administrator
21. جوان 2010 12:22

این مقاله، 6 کار ابتدایی لازم برای ایجاد یک سرویس پایه ای Windows Communication Foundation یا (WCF) و یک client است که می تواند سرویس را فراخوانی کند.

هنگام ایجاد یک basic WCF service، اولین کار، تعریف یک contract است. contract تعیین می کند service چه عملیات هایی را ساپورت کند. می توان یک عملیات را یک متد وب سرویس در نظر گرفت. Contractها بوسیله تعریف یک interface در C++، C#، یا VB ایجاد می شود. هر متد در interface، معادل یک service operation معین است. هر interface باید ServiceContractAttribute و هر operation باید دارای OperationContractAttribute باشد که به آن اعمال شده باشد. اگر متدی در یک interface که ServiceContractAttribute دارد ولی OperationContractAttribute ندارد، آن متد expose نمی شود.

کدی که برای این کار استفاده می شود در زیر آورده شده.

چگونگی ایجاد یک Windows Communication Foundation contract با یک interface

1. Visual Studio 2010 راas administrator باز کنید. (در منوی start، روی برنامه کلیک راست کنید و Run as administrator را اجرا کنید).

2. یک console application project جدید ایجاد کنید. روی منوی file کلیک کنید و New، و سپس Project را انتخاب کنید. در پنجره New Project، Visual Basic یا Visual C# را انتخاب کنید، و سپس Console Application template را انتخاب کنید، و نام آن را Service بگذارید. از Location پیش فرض استفاده کنید.

3. برای پروژه C#، یک فایل بنام Program.cs توسط Visual Studio ایجاد می شود. این کلاس حاوی یک متد خالی به نام Main() است؛ و برای پروژه VB، یک فایل بنام Module1.vb با یک subroutine خالی بنام Main() ایجاد می شود. این متدها برای اینکه یک console application project درست ساخته شود ضروری هستند، پس می توان آنها را با خیال راحت در پروژه رها کرد.

4. فضای نامی Service پیش فرض را به Microsoft.ServiceModel.Samples تغییر دهید. برای انجام این کار، روی پروژه در Solution Explorer کلیک راست کنید و Properties را انتخاب کنید. مطمئن شوید که تب Application در سمت چپ Properties dialog ، انتخاب شده باشد. برای پروژه C#، عبارت Microsoft.ServiceModel.Samples را در edit box که نامش Default Namespace است، تایپ کنید. برای پروژه VB, عبارت Microsoft.ServiceModel.Samples را در edit box که نامش Root namespace است، تایپ کنید. روی منوی File کلیک کنید و save all را انتخاب کنید تا تغییرات ذخیره شوند.

5. اگر از C# استفاده می کنید، namespaceیی را که در فایل Program.cs ایجاد شده به Microsoft.ServiceModel.Samples تغییر د هید، همانگونه که در در زیر نشان داده شده:

 

namespace Microsoft.ServiceModel.Samples 
{
class Program
{
static void Main(string[] args)
{
}
}
}

 

اگر از VB استفاده می کنید، یک عبارت Namespace و یک عبارت End Namespace به Module1.vb اضافه کنید، همانگونه که در مثال زیر نشان داده شده است.

 

Namespace Microsoft.ServiceModel.Samples
Module Module1
Sub Main()
End Sub
End Module
End Namespace

 

6. یک refertence به System.ServiceModel.dll به پروژه اضافه کنید:

در Solution Explorer، روی پوشه References زیر پوشه پروژه، راست کلیک کنید و Add Reference را انتخاب کنید.

در Add Reference dialog، تب .NET را انتخاب کنید و بروید پایین تا System.ServiceModel را ببینید، ان را انتخاب کنید و OK را کلیک کنید.

نکته:

هنگام استفاده از command-line compiler (مثلاً Csc.exe یا Vbc.exe)، باید مسیری را نیزبه assemblyها مشخص کنید. در کامپوتری که مثلاً دارای ویندوز ویستا است، مسیر پیش فرض "Windows\Microsoft.NET\Framework\v4.0" است.

7. یک عبارتusing (imports در VB) برای فضای نامی System.ServiceModel اضافه کنید.

در C#:

using System.ServiceModel;

 

در VB:

Imports System.ServiceModel

8. یک interface جدید بنام ICalculator تعریف کنید و صفت ServiceContractAttribute را به آن interface با valueی فضای نامی "http://Microsoft.ServiceModel.Samples" اعمال کنید. تعیین فضای نامی به طور مستقیم، بهترین روش است زیرا به valueی فضای نامی پیش فرض اجازه نمی دهد به contract name اضافه شود.

نکته:

هنگام استفاده از صفات برای نوشتن یادداشت زیر یک interface یا کلاس، می توانید قسمت "Attribute" را از نام صفت، drag کنید. پس ServiceContractAttribute در C#تبدیل به [ServiceContract]، و در VB، تبدیل به <ServiceContract> می شود.

در C#:

[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface Icalculator

در VB:

<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples")> _
Public Interface ICalculator

 

9. متدی را برای هر یک از عملیاتهایی که ICalculator contract، در اینترفیس expose می کند (add، subtract، multiply، و devide)، تعریف کنید و صفت OperationContractAttribute را به هر متدی که می خواهید به عنوان بخشی از WCF contract عمومی expose کنید، اعمال کنید.

در C#:

[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);

در VB:

<OperationContract()> _
nction 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

مثال: کد زیر یک ایتنرفیس پایه ای را نشان می دهد که یک service contract را تعریف می کند.

در C#:

using System;
// Step 5: Add the using statement for the System.ServiceModel namespace
using System.ServiceModel;
namespace Microsoft.ServiceModel.Samples
{
// Step 6: Define a service contract.
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
// Step7: Create the method declaration for the contract.
[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);
}
}

در VB:

Imports System
' Step 5: Add the Imports statement for the System.ServiceModel namespace
Imports System.ServiceModel

Namespace Microsoft.ServiceModel.Samples
' Step 6: 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
End Namespace

الان، اینترفیس ایجاد شده است.