2009-10-08 15 views
10

के भीतर घटनाओं की सदस्यता लें मुझे डब्ल्यूसीएफ सेवा की कार्यक्षमता पर कुछ वास्तविक समय रिपोर्टिंग करने की आवश्यकता है। यह सेवा एक विंडोज ऐप में स्वयं-होस्ट की जाती है, और मेरी आवश्यकता क्लाइंट द्वारा कुछ विधियों को बुलाए जाने पर मेजबान ऐप पर "लाइव" की रिपोर्ट करना है।डब्ल्यूसीएफ सेवा

कार्य पर मेरा प्रारंभिक विचार सेवा कोड में "NotifyNow" ईवेंट प्रकाशित करना था, और मेरे कॉलिंग ऐप में ईवेंट की सदस्यता लेना था, लेकिन ऐसा संभव नहीं लगता है। मेरी सेवा कोड (कार्यान्वयन, नहीं अंतरफलक) के भीतर मैं निम्नलिखित

public delegate void MessageEventHandler(string message); 
public event MessageEventHandler outputMessage; 

void SendMessage(string message) 
{ 
    if (null != outputMessage) 
    { 
     outputMessage(message); 
    } 
} 

जोड़ने की कोशिश की और SendMessage विधि कॉल जब भी मैं कुछ कार्रवाई के मेजबान एप्लिकेशन सूचित करने की आवश्यकता है। (यह एक विनफॉर्म ऐप में इस तरह के इंटर-फॉर्म संचार के बारे में मुझे याद है, और मेरी याददाश्त ने मुझे यहां छोड़ दिया होगा ...)

जब मैं अपने होस्ट में ईवेंट हैंडलर को हुक करने की कोशिश करता हूं , हालांकि, मैं यह पता लगाने की घटनाओं के लिए संलग्न करने के लिए कैसे ... मेरी होस्टिंग कोड है (संक्षेप में) नहीं कर पा रहे

service = new ServiceHost(typeof(MyService)); 
service.outputMessage += new MyService.MessageEventHandler(frm2_outputMessage); 
    // the above line does not work! 
service.Open(); 

(आज़माएं/कैच में लिपटे)।

कोई भी मुझे बता सकता है कि काम करने के लिए यह तरीका कैसे प्राप्त करें या मुझे बेहतर तरीके से इंगित करें।

TIA

उत्तर

11

मैंने आज सुबह कुछ और शोध किया, और पहले से ही उल्लिखित की तुलना में एक बहुत ही सरल समाधान स्थापित किया। जानकारी का मुख्य स्रोत this page था, लेकिन इसका सारांश यहां दिया गया है।

1) सेवा वर्ग में, निम्नलिखित (या समान) कोड जोड़ ..

public static event EventHandler<CustomEventArgs> CustomEvent; 

public void SendData(int value) 
{  
    if (CustomEvent != null) 
     CustomEvent(null, new CustomEventArgs()); 
} 

महत्वपूर्ण बिट घटना स्थिर बनाने के लिए है, अन्यथा आप इसे पकड़ने का कोई मौका नहीं होगा।

2), एक CustomEventArgs वर्ग को परिभाषित करें उदाहरण के लिए ...

public class CustomEventArgs : EventArgs 
{ 
    public string Message; 
    public string CallingMethod;       
} 

3) सेवा है जिसमें आप रुचि रखते से प्रत्येक विधि में कोड बुला जोड़ें ...

public string MyServiceMethod() 
{ 
    SendData(6); 
} 

4) सर्विसहोस्ट को सामान्य के रूप में इंस्टेंट करें, और ईवेंट में हुक करें।

ServiceHost host = new ServiceHost(typeof(Service1)); 
Service1.CustomEvent += new EventHandler<CustomEventArgs>(Service1_CustomEvent); 
host.Open(); 

5) ईवेंट संदेशों को संभालें जो मेजबान से बबल तक हैं।

+0

कस्टमइवेंट मेरे लिए सेवा 1 के तहत दिखाई नहीं देता है। क्या यह डब्ल्यूसीएफ 4.5 के साथ काम करता है? –

1

आप एक डिफ़ॉल्ट ServiceHost वर्ग instantiating हो रहे हैं:

service = new ServiceHost(typeof(MyService)); 
       *********** 
service.outputMessage += new MyService.MessageEventHandler(frm2_outputMessage); 
    // the above line does not work! 

और मैं अत्यधिक शक नहीं है कि एक ईवेंट हैंडलर के लिए एक "outputMessage" संपत्ति के लिए होगा।

आप अपने स्वयं के कस्टम सेवा मेजबान कुछ इस तरह instantiating नहीं होना चाहिए,:

class MyCustomServiceHost : ServiceHost 
{ 
    ...... your custom stuff here ...... 
} 

service = new MyCustomServiceHost(typeof(MyService)); 
       ******************* 
service.outputMessage += new MyService.MessageEventHandler(frm2_outputMessage); 

??

मार्क

+0

यह एक अच्छा समाधान की तरह दिखता है, लेकिन मुझे यह स्वीकार करने के लिए कबूल करना है कि मैं इसके बारे में कैसे जाना चाहूंगा ... मैं आपके साथ पूरी तरह से हूं ... आपकी कस्टम सामग्री यहां ... :(I मुझे लगता है कि जिस मुद्दे पर मैं सामना कर रहा हूं, वह वास्तव में सेवा में मुख्य घटना हैंडलिंग कोड में घुसपैठ कर रहा है – ZombieSheep

+0

घर आने और थोड़ी देर के लिए अपना दिमाग बंद करने के बाद, मैं बिल्कुल देख रहा हूं कि आप क्या कह रहे हैं - मैं देख रहा हूं सर्विसहोस्ट, सेवा का उदाहरण नहीं है ... मुझे कल इसे फिर से देखना होगा और इस बात को समझना होगा कि मुझे कस्टम सर्विसहोस्ट में कोड को पास करने के लिए क्या करना है। धन्यवाद – ZombieSheep

11

सेवा चर ServiceHost का एक उदाहरण आपकी सेवा कार्यान्वयन नहीं है। कुछ ऐसा प्रयास करें:

MyService myService = new MyService(); 
myService.outputMessage += new MyService.MessageEventHandler(frm2_outputMessage); 
host = new ServiceHost(myService); 
+0

उपरोक्त, हालांकि मैं इस मार्ग से नीचे नहीं गया - मुझे आज दोपहर में कुछ समस्याएं थीं जिसका मतलब था कि मैं उस पर आवश्यक समय नहीं दे सका। :) – ZombieSheep

+0

एक आकर्षण की तरह काम किया – Eric

संबंधित मुद्दे