2012-04-20 19 views
10

में कच्चे अनुरोध को लॉग इन करने के लिए मेरे पास कई विधियों के साथ एक डब्ल्यूसीएफ सेवा है। मैं क्लाइंट से आया कच्चे अनुरोध को लॉग इन करना चाहता हूं चाहे यह कैसे भेजा गया था। एक विधि एक क्वेरी स्ट्रिंग (सख्ती से विरासत का समर्थन के लिए) के रूप में डेटा स्वीकार करता है जो मैं का उपयोग कर लॉग ऑन कर सकते हैं:WCF सेवा

OperationContext.Current.IncomingMessageHeaders.To.AbsoluteUri 

है कि परिदृश्य में पर्याप्त है, लेकिन अन्य तरीकों ग्राहक उत्पन्न एक प्रॉक्सी वर्ग का उपयोग कर XML के रूप में डेटा भेजने के लिए अनुमति देते हैं svcutil.exe द्वारा। शरीर की:

OperationContext.Current.RequestContext.RequestMessage 

दुर्भाग्य से, कोई बात नहीं क्या मैं मैं संदेश की एक बफ़र प्रतिलिपि नहीं बना सकते से पहले इसे पढ़ा है की कोशिश इस परिदृश्य में मैं डेटा मैं में चाहते हैं मिल गया है।

यह संदेश आपरेशन का समर्थन नहीं कर सकते क्योंकि इसे पढ़ कर दिया गया है

public CascadeResponse SendCustomer(Customer c) 
    { 
     Message msg = OperationContext.Current.RequestContext.RequestMessage.CreateBufferedCopy(Int32.MaxValue).CreateMessage(); 
     LogMessage(msg); 
     // Now that the request is logged, get on with the rest 
    } 

SendCustomer की पहली पंक्ति पर फिर भी, मैं निम्नलिखित त्रुटि मिलती है, यहाँ एक उदाहरण है।

यह मेरे बारे में बफर्ड प्रतिलिपि बनाने का मुद्दा है, निश्चित रूप से? मुझे लगता है कि मैं यहां कुछ मूल रूप से गलत कर रहा हूं।

संपादित करें:

ठीक है, तो विधि अब इस तरह है:

public CascadeResponse SendCustomer(Message requestMessage) 
    { 
     Message msg = OperationContext.Current.RequestContext.RequestMessage.CreateBufferedCopy(Int32.MaxValue).CreateMessage(); 
     LogMessage(msg); 
     // Now that the request is logged, get on with the rest   
     Customer c = msg.GetBody<Customer>(); 
     string clientKey = "1111"; // This should be the clientKey string passed to the function along with the customer 
     return SendLead(c, clientKey); 
    } 

मेरे समस्या मैं कैसे ग्राहक पाने के लिए और ClientKey अलग संस्थाओं के रूप में भेजा नहीं पता है कि है। मैं क्लाइंट को ग्राहक की संपत्ति बना सकता हूं (या कस्टम ऑब्जेक्ट बना सकता हूं जो विशेष रूप से डेटा पास करने के लिए है और इसमें ग्राहक और क्लाइंटकी विशेषताएँ हैं), लेकिन यदि संभव हो तो मैं इससे बचना चाहूंगा, क्योंकि यह विरासत प्रणाली का अपग्रेड है पहले से ही इस तरह से काम करता है।

मुझे अपनी प्रॉक्सी कक्षाएं बनाने के लिए svcUtil.exe का उपयोग करने में भी समस्या हो रही है - मुझे लगता है कि उपर्युक्त विधि हस्ताक्षर होने का मतलब है कि मेरी सेवा अब अनुरोध भेजने के लिए सही हस्ताक्षर का विज्ञापन नहीं करेगी? सुनिश्चित नहीं है कि यह पर्याप्त स्पष्ट है - अगर मेरी एकमात्र इनपुट विधि संदेश वस्तु स्वीकार करती है, तो मेरा ग्राहक ग्राहक और क्लाइंटकी को भेजने के बारे में कैसे जानता है?

+0

कोई कारण नहीं है कि आप डब्ल्यूसीएफ में अंतर्निहित ट्रेसिंग कार्यक्षमता का उपयोग क्यों नहीं कर सकते? http://msdn.microsoft.com/en-us/library/ms733025.aspx – DaveRead

+0

@ डेव रीड मुख्य रूप से मुझे इसके बारे में पता नहीं था - क्या इससे मुझे अपने लॉग को डेटाबेस में सहेजने की अनुमति मिलती है? – Maloric

+0

बॉक्स से बाहर नहीं है लेकिन आप अपना खुद का कस्टम ट्रेस लिस्टर बना सकते हैं, विवरण के लिए यह आलेख देखें: http://msdn.microsoft.com/en-gb/magazine/cc300790.aspx – DaveRead

उत्तर

19

मैं एक समाधान है कि दूसरों को भी उपयोगी लग सकते पाया। एक MessageInspector बनाना आप निम्नलिखित के अनुसार, "AfterReceiveRequest" और "BeforeSendReply" घटनाओं के लिए कोड संलग्न करने के लिए अनुमति देता है:

public class MessageInspector : IDispatchMessageInspector 
{ 
    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) 
    { 
     MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue); 
     request = buffer.CreateMessage(); 
     LogMessage("Received:\n{0}", buffer.CreateMessage().ToString()); 
     return null; 
    } 

    public void BeforeSendReply(ref Message reply, object correlationState) 
    { 
     MessageBuffer buffer = reply.CreateBufferedCopy(Int32.MaxValue); 
     reply = buffer.CreateMessage(); 
     LogMessage("Sending:\n{0}", buffer.CreateMessage().ToString()); 
    } 
} 

एक full tutorial for setting up message inspectors fo wcf here नहीं है। जब आप अपने app.config/web.config में व्यवहार एक्सटेंशन जोड़ रहे हों तो मैं आपके पूरी तरह से योग्य असेंबली नाम की जांच करने के लिए सावधान रहूंगा।

आशा है कि किसी और को यह उपयोगी लगेगा।

2

आपको प्राप्त करने के लिए आप ऊपर के रूप में नीचे दिखाया गया है करने के लिए अपने विधि को बदलने की जरूरत में:

public CascadeResponse SendCustomer(Message requestMessage) 
    { 
     Message msg = OperationContext.Current.RequestContext.RequestMessage.CreateBufferedCopy(Int32.MaxValue).CreateMessage(); 
     LogMessage(msg); 
     // Now that the request is logged, get on with the rest   
     Customer c = msg.GetBody<Customer>(); 
    } 

अधिक जानकारी के बारे में Using Message Class

+0

धन्यवाद, यह मुझे सही रास्ते पर मिला लेकिन मुझे एक गुच्छा मिला आवश्यक प्रॉक्सी कक्षाओं को बनाने के लिए svcutil.exe का उपयोग करते समय त्रुटियां। 'wsdl आयात कर सकते हैं नहीं: binding'' wsdl आयात नहीं कर सकता: binding' ... और इतने पर इसके अलावा, मुझे यकीन है कि कैसे अनुरोध शरीर से अतिरिक्त वस्तुओं को पुनः प्राप्त करने नहीं कर रहा हूँ (मेरे उदाहरण केवल एक ही वस्तु निहित, लेकिन वास्तविक कोड में क्लाइंट की पहचान करने वाली एक अतिरिक्त स्ट्रिंग है)। मैं सोमवार को एक और नजर डालेगा, लेकिन अब तक आपकी मदद के लिए धन्यवाद। – Maloric

2

मुझे लगता है कि आप इसका उपयोग कर सकते हैं ...ToString() विधि और क्या करूँगा संदेश आंतरिक पुनर्लेखन है:

string soap = OperationContext.Current.RequestContext.RequestMessage.ToString(); 

ToString() विधि ... अंदर देखो;)

0
एक WCF सेवा परियोजना पर

VS2015 में, आप वेब पर राइट क्लिक कर सकते WCF कॉन्फ़िगरेशन को संपादित करने के लिए .config। यहां से आप कच्चे संदेश लॉग इन करने के लिए निदान सक्षम कर सकते हैं।

+0

क्या आप इस पर विस्तार से बता सकते हैं और वास्तव में निर्दिष्ट और कैसे सेटिंग्स निर्दिष्ट कर सकते हैं? बस यह कथन बनाना उपयोगी होने के लिए पर्याप्त नहीं है। –