میزبانی WCF و استفاده از API سمت سرویس گیرنده
شنبه 28 آذر 1394در این مقاله قصد داریم یکی از روشهای میزبانی WCFبا نام Windows Hosting را ارائه دهیم. WCF یک تکنولوژی مایکروسافت است که برای پیاده سازی و توسعه SOA یا Service Oriented Architecture استفاده می شود. سرویس می تواند در مکان های مختلف و یا ماشین های مختلف میزبانی شود و سرویس گیرنده این سرویس میزبانی شده را در فرم 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 به صورت زیر خواهد بود.
- WCF
- 3k بازدید
- 3 تشکر