میزبانی WCF و استفاده از API سمت سرویس گیرنده

شنبه 28 آذر 1394

در این مقاله قصد داریم یکی از روشهای میزبانی WCFبا نام Windows Hosting را ارائه دهیم. WCF یک تکنولوژی مایکروسافت است که برای پیاده سازی و توسعه SOA یا Service Oriented Architecture استفاده می شود. سرویس می تواند در مکان های مختلف و یا ماشین های مختلف میزبانی شود و سرویس گیرنده این سرویس میزبانی شده را در فرم API استفاده میکند.

میزبانی WCF و استفاده از  API سمت سرویس گیرنده

    در این مقاله قصد داریم یکی از روشهای میزبانی  WCFبا نام Windows Hosting   را ارائه دهیم. WCF  یک تکنولوژی مایکروسافت است که برای پیاده سازی و توسعه  SOA یا  Service Oriented Architecture استفاده می شود.  سرویس می تواند در مکان های مختلف و یا ماشین های مختلف میزبانی شود و سرویس گیرنده این سرویس میزبانی شده را در فرم  API  استفاده میکند. سرویس می تواند توسط چندین سرویس گیرنده استفاده شود.

 در صورت تمایل میتوانید به صورت رایگان آموزش WCF به همراه پروژه عملی را در سایت تاپ لرن مشاهده کنید .

WCF   به صورت های زیر میزبانی می شود.

IIS Hosting

WAS Hosting

Windows Hosting

 Self-Hosting

در اینجا نحوه میزبانی در Windows و روش استفاده آن را قدم به قدم بررسی خواهیم کرد.

قدم اول ایجاد برنامه سرویس  WCF یا  WCF Service Application است.

 WCF Service Application  برای ایجاد قراردادهای عملیات ، قرارداد خدمات، قرارداد داده و ...  فراهم شده است. قرارداد عملیات متدهایی را فراهم میکند که به سرویس گیرنده ارائه می شوند.

چگونگی ایجاد یک  WCF Service Application  را در زیر آورده ایم.

یک پروژه خالی در ویژوال ایجاد کرده و بر روی Solution explorer  راست کلیک کنید و از  Add  New Project و به WCFرفته و  WCF Service Application را انتخاب و نام آن را  Services  قرار دهید.

منبع  System.ServiceModel  را اضافه کنید.  یک اینترفیس یا رابط با نام  ICalculator ایجاد کرده و کدهای زیر را در آن قرار دهید .  

        
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;

namespace Services
{
    [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);
    }
}

اکنون یک کلاس CalculatorService با پیاده سازی ICalculator  به صورت زیر ایجاد میکنیم.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Services
{
    public class CalculatorService : ICalculator
    {
        public double Add(double number1, double number2)
        {
            double result = number1 + number2;
            return result;
        }

        public double Subtract(double number1, double number2)
        {
            double result = number1 - number2;
            return result;
        }

        public double Multiply(double number1, double number2)
        {
            double result = number1 * number2;
            return result;
        }

        public double Divide(double number1, double number2)
        {
            double result = number1 / number2;
            return result;
        }
    }
}

پروژه را Rebuild کنید تا کتابخانه ها ایجاد شوند.

قدم بعدی ایجاد پروژه سرویس پنجره  WCF  یا  WCF Window Service Project است .

در اینجا محتوای میزبانی  WCF را شرح خواهیم داد . این پروژه شامل قراردادها و جزئیات نقطه پایان (endpoint) است که در فرم  Windows Service  نصب خواهد شد.  در زیر نحوه ایجاد و میزبانی سرویس پنجره WCF  آورده شده است.

بر روی  Solution explorer  راست  کلیک کرده و از  New Project به  Windows Desktop  رفته سپس  Windows Service  را انتخاب کنید و نام آن را  CalculatorWindowsService قرار دهید.  منبع  Services  را به آن اضافه کنید. کلاس  CalculatorWindowsService را باز کرده و  Code View  را کلیک کنید. CalculatorWindowsService.cs و یک فایل باز خواهند شد . این فایل شامل نام سرویس ، ایجاد میزبانی سرویس ، شروع و پایان سرویس است.  

کدهای زیر را در  CalculatorWindowsService.cs  قرار دهید .

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;

namespace CalculatorWindowsService
{
    public class CalculatorWindowsService : ServiceBase
    {
        public ServiceHost serviceHost = null;
        public CalculatorWindowsService()
        {
            // Name the Windows Service    
            ServiceName = "WCFWindowsServiceSample";
        }

        // Start the Windows service.    
        protected override void OnStart(string[] args)
        {
            if (serviceHost != null)
            {
                serviceHost.Close();
            }

            // Create a ServiceHost for the CalculatorService type and     
            // provide the base address.    
            serviceHost = new ServiceHost(typeof(Services.CalculatorService));

            // Open the ServiceHostBase to create listeners and start     
            // listening for messages.    
            serviceHost.Open();
        }

        protected override void OnStop()
        {
            if (serviceHost != null)
            {
                serviceHost.Close();
                serviceHost = null;
            }
        }

    }
}

روی پروژه  CalculatorWindowsService  راست کلیک کرده و از Add New Item گزینه  Installer Class را انتخاب کرده و نام آن را  ProjectInstaller.cs  قرار دهید.  اساسا این کلاس ServiceProcessInstaller  و انواع Service account  را معرفی میکند، مانند: Local System,Local Service, Network Service  و User . و  Account  را به  LocalSystem  نسبت می دهد.

ServiceInstaller  برای مشخص کردن نام سرویس معرفی می شود.

این کلاس ServiceProcessInstaller  و  Service را که شامل همه اطلاعات می شوند اضافه میکند.

کدها به صورت زیر می باشد:

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.Linq;
using System.ServiceProcess;
using System.Threading.Tasks;

namespace CalculatorWindowsService
{
    [RunInstaller(true)]
    public partial class ProjectInstaller : System.Configuration.Install.Installer
    {
        private ServiceProcessInstaller process;
        private ServiceInstaller service;
        public ProjectInstaller()
        {
            InitializeComponent();
            process = new ServiceProcessInstaller();
            process.Account = ServiceAccount.LocalSystem;
            service = new ServiceInstaller();
            service.ServiceName = "WCFWindowsServiceSample";
            Installers.Add(process);
            Installers.Add(service);
        }    
    }
}

اکنون Program  را برای اجرای سرویس باز کنید و کدهای زیر را در آن قرار دهید.

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;

namespace CalculatorWindowsService
{
    static class Program
    {
            /// <summary>    
            /// The main entry point for the application.    
            /// </summary>    
            public static void Main()
            {
                ServiceBase.Run(new CalculatorWindowsService());
            }
        
    }
}

App.config  را با service name, baseAddress,Binding,contract و ...  به صورت زیر تنظیم کنید.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <!-- This section is optional with the new configuration model    
               introduced in .NET Framework 4. -->
      <service name="Services.CalculatorService"
               behaviorConfiguration="CalculatorServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8000/ServiceModelSamples/service"/>
          </baseAddresses>
        </host>
        <!-- this endpoint is exposed at the base address provided by host: http://localhost:8000/ServiceModelSamples/service  -->
        <endpoint address=""
                  binding="wsHttpBinding"
                  contract="Services.ICalculator" />
        <!-- the mex endpoint is exposed at http://localhost:8000/ServiceModelSamples/service/mex -->
        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="CalculatorServiceBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="False"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

پروژه را  Rebuild  کنید .

VS 2013 Developer Command Prompt را اجرا کنید و مسیر زیر را بپیمایید.

cd /d F:\Tutorials\C#\Wcf_Test\CalculatorWindowsService\bin\Debug

سپس دستور زیر را اجرا کنید .

WCF_Test>installutil.exe CalculatorWindowsService.exe

این دستور WCF Windows Service  را نصب و میزبانی را فراهم میکند. برای شروع کار سرویس به صورت زیر عمل میکنیم.

جستجوی Services.mst   : اینجا سرویس WCF که در بالا ذکر شد را  پیدا خواهید کرد .

بر روی آن راست کلیک کنید و سرویس را شروع کنید. 

اکنون  Window service   نصب و میزبانی شده است .

قدم بعدی استفاده از سرویس ایجاد شده، سمت سرویس گیرنده است.  سرویس گیرنده می تواند سرویس میزبانی شده را در قالب  API استفاده کند. قدم های زیر برای استفاده از  API  است :

بر روی Solution explorer راست کلیک کنید و  Add New Console project  را انتخاب کنید.

نام آن را  CalculatorClient  قرار دهید.

اکنون  Proxy  سرویس را به روش زیر تولید کنید.

آدرس  http://localhost:8000/ServiceModelSamples/service را در مرورگر باز کنید. مطمئن شوید که  windows service در حال اجرا است.

جزئیات سرویس را باز خواهد کرد.

بر روی آدرس  http://localhost:8000/ServiceModelSamples/service?wsdl  کلیک کنید.

فایل  .wsdl را با فرمت xml دریافت خواهید کرد.

آن فایل را ذخیره کنید.

VS 2013 Developer Command propmpt را باز کنید.

پوشه ای که فایل XML را در آن ذخیره کردید پیمایش کنید و دسور زیر را اجرا کنید.

F:\Tutorials\WCF_Test>svcutil.exe service.xml

این دستور فایل  proxy مانند CalculatorService را تولید خواهد کرد. آن را به پروژه اضافه کنید.

منبع  System.ServiceModel را اضافه کنید .

یک فایل  App.config  را ایجاد کرده و به صورت زیر تنظیم کنید.

<configuration>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_ICustomerService" closeTimeout="00:01:00"
            openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
            allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
            maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
            messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
            useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
              maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None"
                realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:8000/ServiceModelSamples/service" binding="wsHttpBinding"
          contract="ICalculator"/>
    </client>
  </system.serviceModel>
</configuration>

پروژه را Rebuild  کنید .

به کلاس  Program رفته و متد سرویس  API را به صورت زیر فراخوانی کنید.

static void Main(string[] args)
        {
            CalculatorClient calculator = new CalculatorClient();
            var addResult = calculator.Add(2, 4);
            Console.WriteLine("Sum: {0}", addResult);
            var result = calculator.Subtract(4, 2);
            Console.WriteLine("Subtract: {0}", result);
            Console.ReadKey();
        }  

ساختار  Solution  به صورت زیر خواهد بود.

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • WCF
  • 3k بازدید
  • 3 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید