ASP.net में चल रहे वेब संदर्भ क्लाइंट से रॉ सोप डेटा प्राप्त करना


95

मैं अपने वर्तमान प्रोजेक्ट में एक वेब सेवा क्लाइंट को गोली मारने की कोशिश कर रहा हूं। मैं सेवा सर्वर (सबसे अधिक संभावना दीपक) के मंच के बारे में निश्चित नहीं हूं। मेरा मानना ​​है कि बाड़ के उनकी तरफ दोष है क्योंकि मैंने अपने ग्राहक के साथ संभावित मुद्दों को समाप्त कर दिया है। ग्राहक एक मानक ASMX प्रकार वेब संदर्भ प्रॉक्सी ऑटो है जो सेवा WSDL से उत्पन्न होता है।

रॉ SOAP संदेश (अनुरोध और प्रतिक्रियाएं) प्राप्त करने के लिए मुझे क्या करने की आवश्यकता है

इस के बारे में जाने के लिए सबसे अच्छा तरीका क्या है?

जवाबों:


135

मैंने web.configSOAP (अनुरोध / रिस्पांस) लिफाफा प्राप्त करने के लिए निम्नलिखित बदलाव किए । यह सभी कच्चे SOAP जानकारी को फ़ाइल में आउटपुट करेगा trace.log

<system.diagnostics>
  <trace autoflush="true"/>
  <sources>
    <source name="System.Net" maxdatasize="1024">
      <listeners>
        <add name="TraceFile"/>
      </listeners>
    </source>
    <source name="System.Net.Sockets" maxdatasize="1024">
      <listeners>
        <add name="TraceFile"/>
      </listeners>
    </source>
  </sources>
  <sharedListeners>
    <add name="TraceFile" type="System.Diagnostics.TextWriterTraceListener"
      initializeData="trace.log"/>
  </sharedListeners>
  <switches>
    <add name="System.Net" value="Verbose"/>
    <add name="System.Net.Sockets" value="Verbose"/>
  </switches>
</system.diagnostics>

2
यह मेरे लिए २०/२०१२ में वीएस २०१० का उपयोग करके काम नहीं कर रहा है। कोई और अधिक अप-टू-डेट समाधान जानता है?
21

2
यह मददगार है। हालाँकि, मेरे मामले में प्रतिक्रियाएँ Gzipped हैं और ASCII या हेक्स कोड को संयुक्त आउटपुट से बाहर खींचना एक दर्द है। क्या उनकी वैकल्पिक आउटपुट विधियां या तो द्विआधारी हैं या केवल पाठ?

2
@Dediqated - आप ऊपर दिए गए उदाहरण में initializeData विशेषता के मान को समायोजित करके ट्रेस.लॉग फ़ाइल में पथ सेट कर सकते हैं।
डौगकाउटो

3
इसका कोई फायदा नहीं है, मैंने कच्चे SOAP डेटा को देखने के लिए वायरशार्क का इस्तेमाल किया। लेकिन फिर भी धन्यवाद!
Dediqated

7
अच्छा। लेकिन मेरे लिए XML जैसा है: System.Net Verbose: 0: [14088] 00000000: 3C 3F 78 6D 6C 20 76 65-72 73 69 6F 6E 3D 22 31: <? Xml version = "1 System .Net Verbose:? 0: [14088] 00000010: 2E 30 22 20 65 6E 63 6F-64 69 6E 67 3D 22 75 74: .0 "एन्कोडिंग =" ut ....... कोई भी विचार है कि इसे कैसे प्रारूपित करना है या केवल xml डेटा है ।
हबीब

35

आप एक SoapExtension को लागू कर सकते हैं जो लॉग फ़ाइल के पूर्ण अनुरोध और प्रतिक्रिया को लॉग करता है। फिर आप web.config में SoapExtension को सक्षम कर सकते हैं, जिससे डीबगिंग उद्देश्यों के लिए चालू / बंद करना आसान हो जाता है। यहाँ एक उदाहरण है जो मैंने अपने स्वयं के उपयोग के लिए पाया और संशोधित किया है, मेरे मामले में लॉगिंग 4 lognet द्वारा किया गया था, लेकिन आप लॉग विधियों को अपने स्वयं के साथ बदल सकते हैं।

public class SoapLoggerExtension : SoapExtension
{
    private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
    private Stream oldStream;
    private Stream newStream;

    public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
    {
        return null;
    }

    public override object GetInitializer(Type serviceType)
    {
        return null;
    }

    public override void Initialize(object initializer)
    {

    }

    public override System.IO.Stream ChainStream(System.IO.Stream stream)
    {
        oldStream = stream;
        newStream = new MemoryStream();
        return newStream;
    }

    public override void ProcessMessage(SoapMessage message)
    {

        switch (message.Stage)
        {
            case SoapMessageStage.BeforeSerialize:
                break;
            case SoapMessageStage.AfterSerialize:
                Log(message, "AfterSerialize");
                    CopyStream(newStream, oldStream);
                    newStream.Position = 0;
                break;
                case SoapMessageStage.BeforeDeserialize:
                    CopyStream(oldStream, newStream);
                    Log(message, "BeforeDeserialize");
                break;
            case SoapMessageStage.AfterDeserialize:
                break;
        }
    }

    public void Log(SoapMessage message, string stage)
    {

        newStream.Position = 0;
        string contents = (message is SoapServerMessage) ? "SoapRequest " : "SoapResponse ";
        contents += stage + ";";

        StreamReader reader = new StreamReader(newStream);

        contents += reader.ReadToEnd();

        newStream.Position = 0;

        log.Debug(contents);
    }

    void ReturnStream()
    {
        CopyAndReverse(newStream, oldStream);
    }

    void ReceiveStream()
    {
        CopyAndReverse(newStream, oldStream);
    }

    public void ReverseIncomingStream()
    {
        ReverseStream(newStream);
    }

    public void ReverseOutgoingStream()
    {
        ReverseStream(newStream);
    }

    public void ReverseStream(Stream stream)
    {
        TextReader tr = new StreamReader(stream);
        string str = tr.ReadToEnd();
        char[] data = str.ToCharArray();
        Array.Reverse(data);
        string strReversed = new string(data);

        TextWriter tw = new StreamWriter(stream);
        stream.Position = 0;
        tw.Write(strReversed);
        tw.Flush();
    }
    void CopyAndReverse(Stream from, Stream to)
    {
        TextReader tr = new StreamReader(from);
        TextWriter tw = new StreamWriter(to);

        string str = tr.ReadToEnd();
        char[] data = str.ToCharArray();
        Array.Reverse(data);
        string strReversed = new string(data);
        tw.Write(strReversed);
        tw.Flush();
    }

    private void CopyStream(Stream fromStream, Stream toStream)
    {
        try
        {
            StreamReader sr = new StreamReader(fromStream);
            StreamWriter sw = new StreamWriter(toStream);
            sw.WriteLine(sr.ReadToEnd());
            sw.Flush();
        }
        catch (Exception ex)
        {
            string message = String.Format("CopyStream failed because: {0}", ex.Message);
            log.Error(message, ex);
        }
    }
}

[AttributeUsage(AttributeTargets.Method)]
public class SoapLoggerExtensionAttribute : SoapExtensionAttribute
{
    private int priority = 1; 

    public override int Priority
    {
        get { return priority; }
        set { priority = value; }
    }

    public override System.Type ExtensionType
    {
        get { return typeof (SoapLoggerExtension); }
    }
}

फिर आप अपने web.config में निम्न अनुभाग जोड़ें जहां YourNamespace और YourAssembly आपके SoapExtension के वर्ग और असेंबली को इंगित करता है:

<webServices>
  <soapExtensionTypes>
    <add type="YourNamespace.SoapLoggerExtension, YourAssembly" 
       priority="1" group="0" />
  </soapExtensionTypes>
</webServices>

मैं इसे जाने दूँगा। मैंने साबुन की सीमाओं पर ध्यान दिया था, लेकिन इसने मुझे देखा कि यह सेवा की मेजबानी के लिए अधिक था। अगर यह काम करता है तो आपको टिक देगा :)
एंड्रयू हैरी

हां, यह आपके वेब एप्लिकेशन से उत्पन्न कॉल को जनरेट प्रॉक्सी के माध्यम से लॉग करने के लिए काम करेगा।
जॉन लेम्प

यह वह मार्ग है जिसके साथ मैं गया था, यह वास्तव में अच्छी तरह से काम कर रहा है, और मैं इसे लॉग करने से पहले किसी भी संवेदनशील डेटा को मास्क करने के लिए xpath का उपयोग कर सकता हूं।
डेव बगदानोव

मुझे क्लाइंट पर साबुन अनुरोध में हेडर जोड़ने की आवश्यकता थी। इससे मुझे मदद मिली। rhyous.com/2015/04/29/…
Rhyous

मैं c # के लिए भी नया हूं और यह निश्चित नहीं हूं कि विधानसभा के नाम के लिए क्या रखा जाए। एक्सटेंशन चलाने के लिए प्रकट नहीं होता है।
कोलिन एंडरसन

28

नहीं यकीन है कि क्यों web.config या एक धारावाहिक वर्ग के साथ सभी उपद्रव। नीचे दिए गए कोड ने मेरे लिए काम किया:

XmlSerializer xmlSerializer = new XmlSerializer(myEnvelope.GetType());

using (StringWriter textWriter = new StringWriter())
{
    xmlSerializer.Serialize(textWriter, myEnvelope);
    return textWriter.ToString();
}

17
कहाँ myEnvelopeसे आता है?
ProfK

6
मुझे समझ में नहीं आता कि इस उत्तर में अधिक उत्थान, सीधे और बिंदु तक क्यों नहीं है! बहुत बढ़िया!
बतिस्ता

1
myEnvalope वह वस्तु होगी जो आप वेब सेवा के माध्यम से भेज रहे हैं। जैसा कि वर्णित है (विशेष रूप से textWriter.tostring फ़ंक्शन) के रूप में मुझे यह काम करने के लिए काफी नहीं मिला, लेकिन यह डिबग मोड में मेरे उद्देश्यों के लिए पर्याप्त रूप से काम करता है जिसमें आप क्रमबद्ध कॉल करने के बाद कच्चे xml देख सकते हैं। इस उत्तर की बहुत सराहना करते हैं, क्योंकि कुछ अन्य लोगों ने मिश्रित परिणामों के साथ काम किया है (उदाहरण के लिए xml का हिस्सा लौटाते हुए web.config का उपयोग करके लॉगिंग करना, और बाहर पार्स करना बहुत आसान नहीं था)।
user2366842

@ बायरबाउंड: क्या यह एन्क्रिप्टेड वीपीएन पर भेजे गए सुरक्षित साबुन संदेशों के साथ काम करेगा?
हमारा आदमी केले में

6
यह उत्तर साबुन के लिफाफे का उत्पादन नहीं करता है, यह सिर्फ xml को क्रमबद्ध करता है। साबुन लिफाफा अनुरोध कैसे प्राप्त करें?
अली कराका

21

Fiddler2 का प्रयास करें यह आपको अनुरोधों और प्रतिक्रिया का निरीक्षण करने देगा। यह ध्यान देने योग्य है कि फिडलर http और https दोनों ट्रैफ़िक के साथ काम करता है।


यह एक https एन्क्रिप्टेड सेवा है
एंड्रयू हैरी

8
Fiddler https ट्रैफ़िक को अनइंक्रिप्ट कर सकते हैं
आरोन फ़िशर

1
मैंने इस समाधान को वेब / app.config में ट्रेसिंग को जोड़ने से बेहतर पाया। धन्यवाद!
अयुक

1
लेकिन config फाइल में system.diagnostics का उपयोग करने के लिए 3 पार्टी ऐप इंस्टॉल करने की आवश्यकता नहीं होती है
अज़ात

1
@AaronFischer: क्या एक एन्क्रिप्टेड वीपीएन पर भेजे गए साबुन संदेशों के साथ फिडलर काम करेगा?
हमारा आदमी केले

6

ऐसा लगता है कि अगर वेब संदर्भ के लिए कॉल एक अपवाद फेंकता है तो टिम कार्टर का समाधान काम नहीं करता है। मैं कच्चे वेब रिसपॉन्स पर जाने की कोशिश कर रहा हूं ताकि एक बार अपवाद को फेंकने के बाद मैं त्रुटि कोड में (कोड में) इसकी जांच कर सकूं। हालाँकि, मुझे पता चल रहा है कि कॉल के अपवाद को फेंकने पर टिम की विधि द्वारा लिखा गया प्रतिक्रिया लॉग खाली है। मैं पूरी तरह से कोड को नहीं समझता हूं, लेकिन ऐसा प्रतीत होता है कि टिम की प्रक्रिया उस बिंदु के बाद प्रक्रिया में कटौती करती है जहां .Net पहले से ही अमान्य है और वेब प्रतिक्रिया को त्याग दिया है।

मैं एक क्लाइंट के साथ काम कर रहा हूं जो निम्न स्तर की कोडिंग के साथ मैन्युअल रूप से एक वेब सेवा विकसित कर रहा है। इस बिंदु पर, वे अपने स्वयं के आंतरिक प्रक्रिया त्रुटि संदेशों को जोड़ रहे हैं क्योंकि HTML ने प्रतिक्रिया स्वरूप संदेशों को SOAP स्वरूपित प्रतिक्रिया से पहले दिया है। बेशक, स्वचालित .Net वेब संदर्भ इस पर चल रहा है। अगर मुझे एक अपवाद के बाद कच्चे HTTP प्रतिक्रिया मिल सकती है, तो मैं मिश्रित रिटर्निंग HTTP प्रतिक्रिया के भीतर किसी भी SOAP प्रतिक्रिया की तलाश और पार्स कर सकता हूं और यह जान सकता हूं कि उन्हें मेरा डेटा ठीक मिला या नहीं।

बाद में ...

यहां एक समाधान है जो काम करता है, यहां तक ​​कि एक निष्पादन के बाद भी (ध्यान दें कि मैं केवल प्रतिक्रिया के बाद हूं - अनुरोध भी मिल सकता है):

namespace ChuckBevitt
{
    class GetRawResponseSoapExtension : SoapExtension
    {
        //must override these three methods
        public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
        {
            return null;
        }
        public override object GetInitializer(Type serviceType)
        {
            return null;
        }
        public override void Initialize(object initializer)
        {
        }

        private bool IsResponse = false;

        public override void ProcessMessage(SoapMessage message)
        {
            //Note that ProcessMessage gets called AFTER ChainStream.
            //That's why I'm looking for AfterSerialize, rather than BeforeDeserialize
            if (message.Stage == SoapMessageStage.AfterSerialize)
                IsResponse = true;
            else
                IsResponse = false;
        }

        public override Stream ChainStream(Stream stream)
        {
            if (IsResponse)
            {
                StreamReader sr = new StreamReader(stream);
                string response = sr.ReadToEnd();
                sr.Close();
                sr.Dispose();

                File.WriteAllText(@"C:\test.txt", response);

                byte[] ResponseBytes = Encoding.ASCII.GetBytes(response);
                MemoryStream ms = new MemoryStream(ResponseBytes);
                return ms;

            }
            else
                return stream;
        }
    }
}

यहां बताया गया है कि आप इसे कॉन्फ़िगर फ़ाइल में कैसे कॉन्फ़िगर करते हैं:

<configuration>
     ...
  <system.web>
    <webServices>
      <soapExtensionTypes>
        <add type="ChuckBevitt.GetRawResponseSoapExtension, TestCallWebService"
           priority="1" group="0" />
      </soapExtensionTypes>
    </webServices>
  </system.web>
</configuration>

"TestCallWebService" को लाइब्रेरी के नाम से बदल दिया जाएगा (जो कि टेस्ट कंसोल ऐप का नाम था जो मैं काम कर रहा था)।

आपको वास्तव में चैनस्ट्रीम में नहीं जाना चाहिए; आप इसे अधिक सरलता से कर सकते हैं

public override void ProcessMessage(SoapMessage message)
{
    if (message.Stage == SoapMessageStage.BeforeDeserialize)
    {
        StreamReader sr = new StreamReader(message.Stream);
        File.WriteAllText(@"C:\test.txt", sr.ReadToEnd());
        message.Stream.Position = 0; //Will blow up 'cause type of stream ("ConnectStream") doesn't alow seek so can't reset position
    }
}

यदि आप SoapMessage.Stream को देखते हैं, तो यह केवल पढ़ने योग्य स्ट्रीम माना जाता है जिसका उपयोग आप इस बिंदु पर डेटा का निरीक्षण करने के लिए कर सकते हैं। यदि आप स्ट्रीम पढ़ते हैं, तो यह एक पेंच-अप 'कारण है, बाद में कोई डेटा नहीं मिलने वाली त्रुटियों के साथ प्रसंस्करण बम (स्ट्रीम अंत में था) और आप स्थिति को शुरुआत में रीसेट नहीं कर सकते।

दिलचस्प बात यह है कि यदि आप दोनों तरीके, चेनस्ट्रीम और प्रोसेसमैज तरीके से करते हैं, तो प्रोसेसमेसेज मेथड काम करेगा क्योंकि आपने कनेक्टस्ट्रीम से लेकर चैनस्ट्रीम में मैमोरीस्ट्रीम में स्ट्रीम टाइप को बदल दिया है, और मेमोरीस्ट्रीम ऑपरेशन की अनुमति देता है। (मैंने कनेक्टस्ट्रीम को मेमोरीस्ट्रीम में डालने की कोशिश की - अनुमति नहीं थी।)

इसलिए ..... Microsoft को या तो चैनस्ट्रीम प्रकार पर परिचालन की अनुमति देनी चाहिए या SoapMessage.Stream को सही मायने में केवल पढ़ने के लिए कॉपी करना चाहिए क्योंकि यह होना चाहिए। (अपने कांग्रेसमैन आदि को लिखें ...)

एक और बात। एक अपवाद के बाद कच्चे HTTP की प्रतिक्रिया को वापस लेने का एक तरीका बनाने के बाद, मुझे अभी भी पूर्ण प्रतिक्रिया नहीं मिली (जैसा कि एक HTTP स्नीफर द्वारा निर्धारित किया गया है)। ऐसा इसलिए था क्योंकि जब विकास वेब सेवा ने प्रतिक्रिया की शुरुआत में HTML त्रुटि संदेश जोड़े थे, तो उसने सामग्री-लंबाई शीर्ष लेख को समायोजित नहीं किया था, इसलिए सामग्री-लंबाई मान वास्तविक प्रतिक्रिया निकाय के आकार से कम था। मेरे पास सभी वर्णों की सामग्री-लंबाई मान संख्या थी - बाकी गायब थे। जाहिर है, जब .Net प्रतिक्रिया धारा पढ़ता है, तो यह केवल सामग्री की लंबाई-लंबाई वर्ण पढ़ता है और सामग्री-लंबाई मान को गलत तरीके से होने की अनुमति नहीं देता है। यह वैसा ही है जैसा इसे होना चाहिए; लेकिन अगर सामग्री-लंबाई हेडर मान गलत है, तो आपको कभी भी संपूर्ण प्रतिक्रिया बॉडी मिलेगी एक HTTP स्निफ़र (I उपयोगकर्ता HTTP विश्लेषक से)http://www.ieinspector.com )।


2

मुझे लगता है कि फ्रेमवर्क आपके लिए लॉगिंग स्ट्रीम में हुकिंग करके लॉगिंग करना पसंद करेगा जो कि फ्रेमवर्क प्रक्रियाओं के रूप में लॉग होता है जो अंतर्निहित स्ट्रीम है। निम्नलिखित आप के रूप में साफ नहीं है जैसा कि मैं चाहूंगा, क्योंकि आप चेनस्ट्रीम विधि में अनुरोध और प्रतिक्रिया के बीच फैसला नहीं कर सकते। निम्नलिखित है कि मैं इसे कैसे संभालता हूं। एक स्ट्रीम विचार को ओवरराइड करने के लिए जॉन हैना के लिए धन्यवाद

public class LoggerSoapExtension : SoapExtension
{
    private static readonly string LOG_DIRECTORY = ConfigurationManager.AppSettings["LOG_DIRECTORY"];
    private LogStream _logger;

    public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
    {
        return null;
    }
    public override object GetInitializer(Type serviceType)
    {
        return null;
    }
    public override void Initialize(object initializer)
    {
    }
    public override System.IO.Stream ChainStream(System.IO.Stream stream)
    {
        _logger = new LogStream(stream);
        return _logger;
    }
    public override void ProcessMessage(SoapMessage message)
    {
        if (LOG_DIRECTORY != null)
        {
            switch (message.Stage)
            {
                case SoapMessageStage.BeforeSerialize:
                    _logger.Type = "request";
                    break;
                case SoapMessageStage.AfterSerialize:
                    break;
                case SoapMessageStage.BeforeDeserialize:
                    _logger.Type = "response";
                    break;
                case SoapMessageStage.AfterDeserialize:
                    break;
            }
        }
    }
    internal class LogStream : Stream
    {
        private Stream _source;
        private Stream _log;
        private bool _logSetup;
        private string _type;

        public LogStream(Stream source)
        {
            _source = source;
        }
        internal string Type
        {
            set { _type = value; }
        }
        private Stream Logger
        {
            get
            {
                if (!_logSetup)
                {
                    if (LOG_DIRECTORY != null)
                    {
                        try
                        {
                            DateTime now = DateTime.Now;
                            string folder = LOG_DIRECTORY + now.ToString("yyyyMMdd");
                            string subfolder = folder + "\\" + now.ToString("HH");
                            string client = System.Web.HttpContext.Current != null && System.Web.HttpContext.Current.Request != null && System.Web.HttpContext.Current.Request.UserHostAddress != null ? System.Web.HttpContext.Current.Request.UserHostAddress : string.Empty;
                            string ticks = now.ToString("yyyyMMdd'T'HHmmss.fffffff");
                            if (!Directory.Exists(folder))
                                Directory.CreateDirectory(folder);
                            if (!Directory.Exists(subfolder))
                                Directory.CreateDirectory(subfolder);
                            _log = new FileStream(new System.Text.StringBuilder(subfolder).Append('\\').Append(client).Append('_').Append(ticks).Append('_').Append(_type).Append(".xml").ToString(), FileMode.Create);
                        }
                        catch
                        {
                            _log = null;
                        }
                    }
                    _logSetup = true;
                }
                return _log;
            }
        }
        public override bool CanRead
        {
            get
            {
                return _source.CanRead;
            }
        }
        public override bool CanSeek
        {
            get
            {
                return _source.CanSeek;
            }
        }

        public override bool CanWrite
        {
            get
            {
                return _source.CanWrite;
            }
        }

        public override long Length
        {
            get
            {
                return _source.Length;
            }
        }

        public override long Position
        {
            get
            {
                return _source.Position;
            }
            set
            {
                _source.Position = value;
            }
        }

        public override void Flush()
        {
            _source.Flush();
            if (Logger != null)
                Logger.Flush();
        }

        public override long Seek(long offset, SeekOrigin origin)
        {
            return _source.Seek(offset, origin);
        }

        public override void SetLength(long value)
        {
            _source.SetLength(value);
        }

        public override int Read(byte[] buffer, int offset, int count)
        {
            count = _source.Read(buffer, offset, count);
            if (Logger != null)
                Logger.Write(buffer, offset, count);
            return count;
        }

        public override void Write(byte[] buffer, int offset, int count)
        {
            _source.Write(buffer, offset, count);
            if (Logger != null)
                Logger.Write(buffer, offset, count);
        }
        public override int ReadByte()
        {
            int ret = _source.ReadByte();
            if (ret != -1 && Logger != null)
                Logger.WriteByte((byte)ret);
            return ret;
        }
        public override void Close()
        {
            _source.Close();
            if (Logger != null)
                Logger.Close();
            base.Close();
        }
        public override int ReadTimeout
        {
            get { return _source.ReadTimeout; }
            set { _source.ReadTimeout = value; }
        }
        public override int WriteTimeout
        {
            get { return _source.WriteTimeout; }
            set { _source.WriteTimeout = value; }
        }
    }
}
[AttributeUsage(AttributeTargets.Method)]
public class LoggerSoapExtensionAttribute : SoapExtensionAttribute
{
    private int priority = 1;
    public override int Priority
    {
        get
        {
            return priority;
        }
        set
        {
            priority = value;
        }
    }
    public override System.Type ExtensionType
    {
        get
        {
            return typeof(LoggerSoapExtension);
        }
    }
}

1
@ टिम्बर ने मेरे लिए काम किया है, केवल एक चीज जिसे मैंने डिलीट किया है वह क्लाइंट पार्ट है, जो मुझे एक कोलोन के साथ एक नाम देता है, जिससे अपवाद होता है। इसलिए एक बार जब मैं इस लाइन को हटा देता हूं, तो यह उन लोगों के लिए ठीक है जो हर अनुरोध / प्रतिक्रिया के लिए एक फाइल रखना चाहते हैं। यदि आप अन्य उत्तरों को पढ़ते हैं, तो जोड़ने के लिए केवल एक चीज स्पष्ट होती है, और यह है कि आपको साबुन के तनाव को इंगित करने के लिए web.config नोड को जोड़ना होगा। धन्यवाद!
netadictos

1

यहाँ शीर्ष उत्तर का एक सरलीकृत संस्करण है। इसे <configuration>अपने web.configया App.configफ़ाइल के तत्व में जोड़ें । यह trace.logआपके प्रोजेक्ट के bin/Debugफ़ोल्डर में एक फ़ाइल बनाएगा । या, आप initializeDataविशेषता का उपयोग करके लॉग फ़ाइल के लिए एक पूर्ण पथ निर्दिष्ट कर सकते हैं ।

  <system.diagnostics>
    <trace autoflush="true"/>
    <sources>
      <source name="System.Net" maxdatasize="9999" tracemode="protocolonly">
        <listeners>
          <add name="TraceFile" type="System.Diagnostics.TextWriterTraceListener" initializeData="trace.log"/>
        </listeners>
      </source>
    </sources>
    <switches>
      <add name="System.Net" value="Verbose"/>
    </switches>
  </system.diagnostics>

यह चेतावनी देता है कि maxdatasizeऔर tracemodeविशेषताओं की अनुमति नहीं है, लेकिन वे लॉग किए जा सकने वाले डेटा की मात्रा बढ़ाते हैं, और हेक्स में सब कुछ लॉग करने से बचते हैं।


0

आपने यह निर्दिष्ट नहीं किया है कि आप किस भाषा का उपयोग कर रहे हैं, लेकिन C # / .NET मानकर आप SOAP एक्सटेंशन का उपयोग कर सकते हैं

अन्यथा, एक स्निफर का उपयोग करें जैसे कि विंडसर्क


1
हाँ, वायरशर्क की कोशिश की, यह केवल मुझे हेडर जानकारी दिखा सकता है, साबुन सामग्री एन्क्रिप्टेड है।
एंड्रयू हैरी

शायद इसलिए कि आप https का उपयोग कर रहे हैं। SOAP एक्सटेंशन जहाँ तक मुझे याद है कि उच्च स्तर पर काम हो सकता है इसलिए आपको डिक्रिप्ट होने के बाद डेटा को देखने में सक्षम होना चाहिए।
राबाइब

2
Wireshark के बजाय Fiddler का उपयोग करें, यह https को बॉक्स से बाहर निकाल देता है।
रोड्रिगो स्ट्रॉस

-1

मुझे लगता है कि मुझे पार्टी में काफी देर हो गई है, और चूंकि भाषा वास्तव में निर्दिष्ट नहीं थी, यहाँ Bimmerbound के उत्तर के आधार पर VB.NET समाधान है, अगर किसी को भी इस मामले में ठोकर लगती है और समाधान की आवश्यकता होती है। ध्यान दें: यदि आपके पास पहले से ही नहीं है, तो आपको अपनी परियोजना में स्ट्रिंगर वर्ग का संदर्भ लेना होगा।

 Shared Function returnSerializedXML(ByVal obj As Object) As String
    Dim xmlSerializer As New System.Xml.Serialization.XmlSerializer(obj.GetType())
    Dim xmlSb As New StringBuilder
    Using textWriter As New IO.StringWriter(xmlSb)
        xmlSerializer.Serialize(textWriter, obj)
    End Using


    returnSerializedXML = xmlSb.ToString().Replace(vbCrLf, "")

End Function

बस फ़ंक्शन को कॉल करें और यह वेब की सेवा में पास होने का प्रयास कर रहे ऑब्जेक्ट के क्रमबद्ध xml के साथ एक स्ट्रिंग लौटेगा (वास्तविक रूप से, यह किसी भी वस्तु के लिए काम करना चाहिए जिसे आप इसे भी फेंकना चाहते हैं)।

एक साइड नोट के रूप में, xml को वापस करने से पहले फ़ंक्शन में कॉल को आउटपुट से vbCrLf वर्णों को अलग करना है। मेरा उनके पास जेनरेट किए गए xml के भीतर एक गुच्छा था, लेकिन यह स्पष्ट रूप से इस बात पर निर्भर करता था कि आप क्या क्रमबद्ध करने की कोशिश कर रहे हैं, और मुझे लगता है कि वे वेब सेवा को भेजे जा रहे ऑब्जेक्ट के दौरान छीन लिए जा सकते हैं।


जिस किसी ने भी मुझे थप्पड़ मारा था, कृपया बेझिझक मुझे बताएं कि मैं क्या याद कर रहा हूं / क्या सुधार किया जा सकता है।
user2366842
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.