रिमोटिंग का उपयोग न करें! हालांकि यह निश्चित रूप से काम करेगा, माइक्रोसॉफ्ट का कहना है कि रिमोटिंग एक विरासत तकनीक है और सभी नए वितरित अनुप्रयोगों को डब्ल्यूसीएफ का उपयोग करके विकसित किया जाना चाहिए। अधिक जानकारी के लिए here देखें।
विंडोज संचार फाउंडेशन (डब्ल्यूसीएफ) एक दूसरे के साथ संवाद करने के लिए दो .NET प्रक्रियाओं के लिए अनुशंसित तरीका है। डब्ल्यूसीएफ एक एकीकृत प्रोग्रामिंग मॉडल प्रदान करता है जो विशिष्ट संचार तंत्र, जैसे सॉकेट, पाइप इत्यादि से जुड़ी कई जटिलताओं को सारणित करके वितरित विकास को बहुत सरल बनाता है
आपकी स्थिति के विवरण को देखते हुए, मैं प्रत्येक विंडोज सेवा प्लगइन बनाने का सुझाव दूंगा एक डब्ल्यूसीएफ सेवा। प्रत्येक डब्ल्यूसीएफ सेवा के लिए, यानी, प्लगइन, इंटरफ़ेस को परिभाषित करें जिसे इसे आपके यूआई में बेनकाब करने की आवश्यकता है। इंटरफ़ेस बस ServiceContract विशेषता के साथ सजाए गए एक सी # इंटरफ़ेस है। इस इंटरफेस में विधियां हैं, जिनमें से प्रत्येक OperationContract विशेषता से सजा है, कि आपका यूआई डब्ल्यूसीएफ सेवा (प्लगइन) के साथ संवाद करने के लिए उपयोग करेगा। ये विधियां किसी भी धारावाहिक .NET प्रकार को स्वीकार या वापस कर सकती हैं, या अक्सर, आपके स्वयं के कस्टम प्रकारों के मामले में। डब्ल्यूसीएफ के साथ कस्टम प्रकारों का उपयोग करने के लिए, उन्हें DataContract विशेषता के साथ बस सजाने के लिए और उन सदस्यों को चिह्नित करें जिन्हें आप डब्ल्यूसीएफ के माध्यम से DataMember विशेषता के साथ आदान-प्रदान करना चाहते हैं।
एक बार आपके पास ServiceContract इंटरफ़ेस परिभाषित हो जाने के बाद, उस इंटरफ़ेस को लागू करने वाली कक्षा को परिभाषित करें। प्रत्येक OperationContract विधि जो कुछ भी करने की ज़रूरत है, उदाहरण के लिए, डेटाबेस के साथ बातचीत करें, कुछ मूल्य की गणना करें, आदि। एक बार ऐसा करने के बाद, आपने प्रभावी रूप से डब्ल्यूसीएफ सेवा को परिभाषित किया है। यहाँ एक छोटी है, लेकिन काम, उदाहरण है:
using System.ServiceModel;
namespace AdditionServiceNamespace
{
[DataContract]
public class Complex
{
[DataMember]
public int real;
[DataMember]
public int imag;
}
[ServiceContract]
public interface IAdditionService
{
[OperationContract]
Complex Add(Complex c1, Complex c2);
}
public class AdditionService : IAdditionService
{
public Complex Add(Complex c1, Complex c2)
{
Complex result = new Complex();
result.real = c1.real + c2.real;
result.imag = c1.imag + c2.imag;
return result;
}
}
}
अगले कदम इस WCF सेवा की मेजबानी के लिए इतना है कि यह अपने यूआई द्वारा इस्तेमाल किया जा करने के लिए उपलब्ध है। यदि आप एक Windows सेवा का उपयोग किया जाएगा के बाद से, अपने WCF सेवा की मेजबानी आसानी से अपने Windows सेवा की OnStart()
कॉलबैक में पर्याप्त किया जाता है, तो जैसे:
using System.ServiceModel;
using System.ServiceProcess;
using AdditionServiceNamespace;
namespace WindowsServiceNamespace
{
public class WindowsService : ServiceBase
{
static void Main()
{
ServiceBase[] ServicesToRun = new ServiceBase[]
{ new WindowsService() };
ServiceBase.Run(ServicesToRun);
}
private ServiceHost _host;
public WindowsService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
_host = new ServiceHost(typeof(AdditionService));
_host.Open();
}
protected override void OnStop()
{
try
{
if (_host.State != CommunicationState.Closed)
{
_host.Close();
}
}
catch
{
// handle exception somehow...log to event viewer, for example
}
}
}
}
केवल एक चीज है करने के लिए छोड़ दिया है एक app.config फ़ाइल को परिभाषित करने के आपकी विंडोज सेवा के लिए जो आपकी डब्ल्यूसीएफ सेवा के कुछ आवश्यक पहलुओं को कॉन्फ़िगर करेगा। यह ओवरकिल की तरह प्रतीत हो सकता है, लेकिन दो चीजों को ध्यान में रखें। सबसे पहले, जब आप अपनी परियोजना में डब्ल्यूसीएफ सेवा कक्षा जोड़ते हैं तो विजुअल स्टूडियो आपको स्वचालित रूप से एक बुनियादी ऐप.कॉन्फिग फ़ाइल देता है। दूसरा, ऐप।कॉन्फ़िगरेशन फ़ाइल आपको कोड में बदलाव की आवश्यकता के बिना आपके डब्ल्यूसीएफ सेवा पर नियंत्रण की जबरदस्त राशि प्रदान करती है।
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="AdditionServiceNamespace.MyAdditionService"
behaviorConfiguration="default">
<endpoint name="AdditionService"
address="net.pipe://localhost/AdditionService"
binding="netNamedPipeBinding"
contract="AdditionServiceNamespace.IAdditionService" />
<endpoint address="net.pipe://localhost/AdditionService/MEX"
binding="mexNamedPipeBinding"
contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="default>
<serviceMetadata />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
नोट AdditionService WCF सेवा दो समाप्ति बिंदुओं है: यहाँ ऊपर के उदाहरण के लिए साथी app.config फ़ाइल है। मेटाडेटा एक्सचेंज एंडपॉइंट क्लाइंट द्वारा कोड जनरेशन के लिए उपयोग किया जाता है, इसलिए इसे अभी अनदेखा करें। पहला एंडपॉइंट NetNamedPipeBinding का उपयोग करने के लिए कॉन्फ़िगर किया गया है। यह उपयोग करने के लिए बाध्यकारी है यदि आपका यूआई और विंडोज सेवा उसी मशीन पर चल रही है (उपयोग करने के लिए उचित बाध्यकारी चुनने पर फ्लोचार्ट के लिए here देखें)। हालांकि, यह बाध्यकारी उपयोग नहीं किया जा सकता है यदि आपकी यूआई और विंडोज सेवा विभिन्न मशीनों पर चल रही होगी। उस स्थिति में, आप प्रतिस्थापन के रूप में NetTcpBinding का उपयोग कर सकते हैं। NetNamedPipeBinding के लिए NetTcpBinding स्थानापन्न लिए, आप बस का पता और अंत बिंदु के बंधन, इस तरह बदलने की जरूरत होगी:
<endpoint name="AdditionService"
address="net.tcp://<machine hostname here>/AdditionService"
binding="netTcpBinding"
contract="AdditionServiceNamespace.IAdditionService" />
कोई कोड परिवर्तन आवश्यक हैं! परिवर्तन करें, अपनी सेवा को पुनरारंभ करें, और आपकी डब्ल्यूसीएफ सेवा अब दूरस्थ मशीनों के लिए उपलब्ध है। यदि आप चाहें तो आप एक ही डब्ल्यूसीएफ सेवा के लिए कई एंडपॉइंट्स को भी अनुमति दे सकते हैं। मुद्दा यह है कि, app.config फ़ाइल कोड में परिवर्तन की आवश्यकता के बिना लचीलापन की जबरदस्त मात्रा प्रदान करता है।
यही है! अब आपके पास अपनी यूआई द्वारा उपयोग की जाने वाली विंडोज़ सेवा के अंदर होस्ट की गई डब्ल्यूसीएफ सेवा है।
तो यूआई पक्ष, यानी, क्लाइंट साइड, काम कैसे करता है?
यह वह जगह है जहां डब्ल्यूसीएफ की असली शक्ति खेल में आती है। डब्ल्यूसीएफ के साथ शुरू करते समय, सबसे आसान काम विजुअल स्टूडियो की कोड जनरेशन क्षमताओं का लाभ उठाना है। सुनिश्चित करें कि आपकी विंडोज सेवा (AdditionService होस्ट करने वाला एक) चल रहा है। अपने यूआई प्रोजेक्ट में, समाधान एक्सप्लोरर में अपनी प्रोजेक्ट पर राइट-क्लिक करें और सेवा संदर्भ जोड़ें ... मेनू विकल्प। पता बॉक्स, प्रकार net.pipe://localhost/AdditionService
, और में जाओ बटन क्लिक करें। आपको सेवाओं सूची में AdditionService दिखाया जाना चाहिए। और नाम स्थान बॉक्स, प्रकार AdditionService
में ठीक बटन क्लिक करें।
इन चरणों को संपन्न एक ग्राहक प्रॉक्सी और अपने यूआई परियोजना से जुड़ जाते हैं कि एक ठीक से परिभाषित app.config फ़ाइल उत्पन्न होगा। यह क्लाइंट प्रॉक्सी आपके क्लाइंट-साइड एडिशन सर्विस एपीआई बन जाता है, और आप इसे इस तरह उपयोग करते हैं:
using TestConsoleApp.AdditionService;
namespace TestConsoleApp
class Program
{
static void Main(string[] args)
{
AdditionServiceClient client = new AdditionServiceClient();
Complex c1 = new Complex(), c2 = new Complex();
c1.real = 3; c1.imag = 5;
c2.real = 1; c2.imag = 7;
Complex result = client.Add(c1, c2);
}
}
}
ध्यान दें कि यह कितना आसान है। असल में, एक ग्राहक प्रॉक्सी, AdditionServiceClient
, तत्काल है। फिर दो Complex
ऑब्जेक्ट्स बनाए जाते हैं। अंत में, क्लाइंट प्रॉक्सी पर Add()
विधि लागू की गई है, और Complex
परिणाम लौटा दिया गया है।
दृश्यों के पीछे क्या चल रहा है यह है कि क्लाइंट प्रॉक्सी की Add()
विधि वास्तव में विंडोज सेवा में होस्ट की गई अतिरिक्त सेवा WCF सेवा में दो Complex
ऑब्जेक्ट्स को पार कर रही है। AdditionService अतिरिक्त प्रदर्शन करता है और फिर परिणाम देता है। यह सब एक नामित पाइप पर होता है, लेकिन ध्यान दें कि यहां कोई नामित पाइप-विशिष्ट कोड नहीं है! डब्ल्यूसीएफ ने प्रोग्रामिंग मॉडल के पीछे उस जटिलता को समझाया है जिसे IAdditionService इंटरफ़ेस द्वारा परिभाषित किया गया है।
मुझे पता है कि यह पचाने के लिए बहुत सारी जानकारी है, लेकिन मुझे आशा है कि यह स्पष्ट है कि डब्ल्यूसीएफ कितना शक्तिशाली और उपयोग में आसान हो सकता है। बेशक, यह उदाहरण केवल डब्ल्यूसीएफ के भीतर उपलब्ध सभी चीज़ों का एक छोटा सबसेट हिट करता है।
अंत में, डब्ल्यूसीएफ आपके यूआई और आपकी विंडोज सेवा के बीच संवाद करने के लिए उपयोग की जाने वाली तंत्र होनी चाहिए। अधिक जानकारी के लिए, मैं डब्ल्यूसीएफ की सभी चीजों के लिए जुवल लोवी की किताब Programming WCF Services की अत्यधिक अनुशंसा करता हूं। आप मुफ्त डब्ल्यूसीएफ कोड नमूने के लिए, अपनी वेबसाइट, IDesign.net पर भी जा सकते हैं। डब्ल्यूसीएफ के लिए अधिक परिचय के लिए, dnrTV पर यह free video देखें। इसमें डब्ल्यूसीएफ के उद्देश्य को शामिल किया गया है और कुछ आसान-से-पालन उदाहरणों के माध्यम से डब्ल्यूसीएफ प्रोग्रामिंग का प्रदर्शन करता है।
धन्यवाद! यही कारण है कि मुझे इस साइट से प्यार है: डी –
वास्तव में आपको बहुत बहुत धन्यवाद। जावा ऐप के लिए "विंडोज सर्विस रैपर/एडेप्टर" का शोध करते समय इसे ढूंढने के लिए ऐसा हुआ; एक मूल्यवान तैयार किए गए रैपर (किसी भी जावा ऐप के लिए) खरीदने पर विचार कर रहा था ... इस अद्भुत सूचनात्मक प्रतिक्रिया को पढ़ना, सबसे अच्छा रास्ता स्पष्ट है: विजुअल स्टूडियो और सी चश्मे से धूल :-) –