2010-04-06 13 views

उत्तर

11

एक वैकल्पिक SoapExtensions को IHttpModule को लागू करने और के रूप में यह में आ रहा है इनपुट धारा हड़पने के लिए है।

public class LogModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += this.OnBegin; 
    } 

    private void OnBegin(object sender, EventArgs e) 
    { 
     HttpApplication app = (HttpApplication)sender; 
     HttpContext context = app.Context; 

     byte[] buffer = new byte[context.Request.InputStream.Length]; 
     context.Request.InputStream.Read(buffer, 0, buffer.Length); 
     context.Request.InputStream.Position = 0; 

     string soapMessage = Encoding.ASCII.GetString(buffer); 

     // Do something with soapMessage 
    } 

    public void Dispose() 
    { 
     throw new NotImplementedException(); 
    } 
} 
+2

टूट गया है हो सकता है, लेकिन आप स्पष्ट web.config में IHttpModule रजिस्टर करने के लिए आवश्यकता हो सकती है <जोड़ने नाम = "LogModule" type = "MyNameSpace.LogModule" />

1

मैं तुम्हें पता लगाने के लिए सोप अनुरोध लॉग इन करने के लिए इच्छुक रहे हैं मान; शायद आपके पास आपकी सेवा का उपभोक्ता है जो आपको बता रहा है कि वे आपको अच्छा एसएएपी भेज रहे हैं, लेकिन आप उन पर विश्वास नहीं करते हैं, हाँ?

उस स्थिति में, आपको (अस्थायी रूप से) enable trace logging on your service चाहिए।

यदि आप सामान्य उद्देश्य लॉगिंग करने की कोशिश कर रहे हैं, तो एसओएपी पैकेट से परेशान न हों, क्योंकि यह भारी है; आपके लॉग जल्दी फट जाएगा। बस महत्वपूर्ण चीजें लॉग करें, जैसे उदा। "कहा जाता है, एक्स = foo, वाई = बार"।

+1

दुर्भाग्यवश इसे स्थायी होने की आवश्यकता है, इसलिए मैं केवल अस्थायी रूप से ट्रेस को सक्षम नहीं कर सकता। –

+0

@ बंगोकर: हालांकि आपको एक समाधान मिला है जो आपकी तत्काल आवश्यकता को भरता है, मेरा सुझाव है कि आप अपने पाठ्यक्रम पर पुनर्विचार करें। प्रत्येक एसओएपी अनुरोध लॉगिंग भारी और बेहद अनावश्यक है। – Randolpho

6

हां, आप इसे साबुन एक्सटेंशन का उपयोग करके कर सकते हैं। यहां एक nice article है जो प्रक्रिया के माध्यम से चलता है।

+0

मुझे लगता है कि मैं जो खोज रहा था, धन्यवाद! –

+4

लिंक टूटा हुआ है। लिंक के बाद से जवाब के रूप में – wRAR

+0

अचिह्नित –

5

तुम भी contents of the Request.InputStream पढ़ सकते हैं।

इस तरह से मामलों के लिए यह अधिक उपयोगी है जब आप इनपुट की सामग्री के आधार पर WebMethod के भीतर सत्यापन या अन्य कार्रवाइयां करना चाहते हैं।

using System; 
using System.Collections.Generic; 
using System.Web; 
using System.Xml; 
using System.IO; 
using System.Text; 
using System.Web.Services; 
using System.Web.Services.Protocols; 

namespace SoapRequestEcho 
{ 
    [WebService(
    Namespace = "http://soap.request.echo.com/", 
    Name = "SoapRequestEcho")] 
    public class EchoWebService : WebService 
    { 

    [WebMethod(Description = "Echo Soap Request")] 
    public XmlDocument EchoSoapRequest(int input) 
    { 
     // Initialize soap request XML 
     XmlDocument xmlSoapRequest = new XmlDocument(); 

     // Get raw request body 
     Stream receiveStream = HttpContext.Current.Request.InputStream 

     // Move to begining of input stream and read 
     receiveStream.Position = 0; 
     using (StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8)) 
     { 
     // Load into XML document 
     xmlSoapRequest.Load(readStream); 
     } 

     // Return 
     return xmlSoapRequest; 
    } 
    } 
} 

नोट: नीचे जॉन्स टिप्पणी प्रतिबिंबित करने के लिए अद्यतन किया गया।

+0

क्या आपने इस कोड को आजमाया है? अन्य चीजों के अलावा, मुझे नहीं लगता कि आपके पास 'उपयोग' ब्लॉक होना चाहिए, क्योंकि आप 'स्ट्रीम' नहीं बना रहे हैं। 'StreamReader' भी' उपयोग 'ब्लॉक में नहीं होना चाहिए, क्योंकि इसका निपटान स्ट्रीम को भी बंद कर देगा, और स्ट्रीम आपके नहीं है। मैं यह भी सवाल करता हूं कि यह किसी भी 'सोपएक्सेंशन' के साथ अंतःक्रिया करेगा जो बाद में कॉन्फ़िगर किया जा सकता है। –

+0

हां, मैंने कोशिश की और ठीक काम करता है (लिंक पर क्लिक करने का प्रयास करें), उपयोग या उपयोग करने के लिए, यह केवल एक प्रोग्रामर विकल्प है कि आप अपने कोड को कैसे व्यवस्थित करना चाहते हैं। –

+1

@ स्टेवेन: आप इस मामले में 'उपयोग' के बारे में गलत हैं। यदि यह 'var x = new StreamReader()) का उपयोग कर रहा था, तो यह एक विकल्प होगा -' StreamReader' आपके लिए है क्योंकि आपने इसे बनाया है। इस मामले में, 'स्ट्रीम'' अनुरोध 'ऑब्जेक्ट से संबंधित है - आपने इसे नहीं बनाया है, इसलिए आपको इसे कभी भी' निपटान 'नहीं करना चाहिए। –