ASP.net এ চলমান একটি ওয়েব রেফারেন্স ক্লায়েন্টের কাছ থেকে RAW সাবান ডেটা প্রাপ্ত করা


95

আমি আমার বর্তমান প্রকল্পে একটি ওয়েব পরিষেবা ক্লায়েন্টকে গুলি করার চেষ্টা করছি। আমি সার্ভিস সার্ভারের প্ল্যাটফর্ম সম্পর্কে নিশ্চিত নই (সম্ভবত সম্ভবত এলএএমপি)। আমি বিশ্বাস করি যে বেড়ার পাশে তাদের ত্রুটি আছে কারণ আমি আমার ক্লায়েন্টের সাথে সম্ভাব্য সমস্যাগুলি মুছে ফেলেছি। ক্লায়েন্টটি হ'ল ডাব্লুএসডিএল থেকে উত্পন্ন একটি স্ট্যান্ডার্ড এএসএমএক্স টাইপের ওয়েব রেফারেন্স প্রক্সি অটো।

আমার যা যা করা দরকার তা হ'ল RAW SOAP বার্তা (অনুরোধ এবং প্রতিক্রিয়া)

এটি সম্পর্কে সবচেয়ে ভাল উপায় কি?

উত্তর:


135

আমি web.configএসওএপি (অনুরোধ / প্রতিক্রিয়া) খাম পেতে নিম্নলিখিত পরিবর্তনগুলি করেছি । এটি সমস্ত কাঁচা এসওএপি তথ্য ফাইলে আউটপুট দেবে 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>

4
এটি ভিএস ২০১০ ব্যবহার করে আমার জন্য ২২/২০১২ তে কাজ করছে না a যে কেউ আরও আপ-টু-ডেট সমাধান জানেন?
qxotk

4
এটি সহায়ক। যাইহোক, আমার ক্ষেত্রে প্রতিক্রিয়াগুলি জিজিপ করা হয় এবং এএসসিআইআই বা হেক্স কোডগুলি সম্মিলিত আউটপুট থেকে বাইরে নিয়ে যাওয়া একটি ব্যথা। তাদের বিকল্প আউটপুট পদ্ধতিগুলি যা হয় বাইনারি বা কেবল পাঠ্য?

4
@ উত্সর্গীকৃত - আপনি উপরের উদাহরণে আরালাইজডাটা অ্যাট্রিবিউটটির মান সমন্বয় করে ট্রেস.লগ ফাইলের পথ নির্ধারণ করতে পারেন।
ডগকাউটো

4
এটি আর কোনও কাজে আসে না, কাঁচা এসওএপি ডেটা দেখতে আমি ওয়্যারশার্ক ব্যবহার করেছি। যা হোক ধন্যবাদ!
উত্সর্গীকৃত

7
ভাল. তবে আমার জন্য এক্সএমএলটি হ'ল: সিস্টেম.নেট ভার্বোজ: 0: [14088] 00000000: 3 সি 3 এফ 78 6 ডি 6 সি 20 76 65-72 73 69 6F 6E 3 ডি 22 31: <? এক্সএমএল সংস্করণ = "1 সিস্টেম. নেট ভারবোজ: 0: [14088] 00000010: 2E 30 22 20 65 6E 63 6F-64 69 6E 67 3 ডি 22 75 74: .0 "এনকোডিং =" উত ....... কীভাবে এটির বিন্যাস করতে হবে বা কেবল এক্সএমএল ডেটা থাকবে তার কোনও ধারণা ।?
হবিব

35

আপনি একটি সোপএক্সটেনশন প্রয়োগ করতে পারেন যা লগ ফাইলে সম্পূর্ণ অনুরোধ এবং প্রতিক্রিয়া লগ করে। তারপরে আপনি ওয়েবকনফাইগে সোপ এক্সটেনশন সক্ষম করতে পারবেন, এটি ডিবাগিংয়ের উদ্দেশ্যে অন / অফ করা সহজ করে তোলে। এখানে একটি উদাহরণ রয়েছে যা আমি আমার নিজের ব্যবহারের জন্য খুঁজে পেয়েছি এবং সংশোধন করেছি, আমার ক্ষেত্রে লগিং লগ 4 নেট দ্বারা করা হয়েছিল তবে আপনি লগের পদ্ধতিগুলি আপনার নিজের সাথে প্রতিস্থাপন করতে পারেন।

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); }
    }
}

তারপরে আপনি আপনার ওয়েবকনফাইগটিতে নিম্নলিখিত বিভাগটি যুক্ত করুন যেখানে আপনার নামস্পেস এবং আপনারঅ্যাসবেশন আপনার সোপ এক্সটেনশনের শ্রেণি এবং সমাবেশকে নির্দেশ করে:

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

আমি এক বার যেতে হবে। আমি সাবান প্রসারণের দিকে নজর রেখেছি, তবে পরিষেবাটি হোস্টিংয়ের জন্য এটি আমার মতো দেখেছিল। এটি যদি কাজ করে তবে আপনাকে টিক দেবে :)
অ্যান্ড্রু হ্যারি

হ্যাঁ, এটি উত্পন্ন প্রক্সি দিয়ে আপনার ওয়েব অ্যাপ্লিকেশন থেকে কলগুলি লগ করতে কাজ করবে।
জন লেম্প

এটি সেই পথেই গিয়েছিলাম, এটি সত্যিই ভাল কাজ করছে এবং লগ ইন করার আগে আমি কোনও সংবেদনশীল ডেটা মাস্ক করার জন্য এক্সপথ ব্যবহার করতে পারি।
ডেভ বাগদানভ

ক্লায়েন্টের সাবান অনুরোধে আমার শিরোনাম যুক্ত করা দরকার। এটি আমাকে সাহায্য করেছিল। rhyous.com/2015/04/29/…
ছড়া

আমি সি # তেও নতুন এবং সংসদ সদস্যের নাম রাখার বিষয়ে নিশ্চিত নই। এক্সটেনশনটি চলমান বলে মনে হয় না।
কলিন অ্যান্ডারসন

28

নিশ্চিত না কেন ওয়েবকনফিগ বা সিরিয়ালাইজার শ্রেণীর সাথে সমস্ত কলহ। নীচের কোডটি আমার পক্ষে কাজ করেছে:

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

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

18
কোথা myEnvelopeথেকে আসে?
প্রোফেক

6
আমি বুঝতে পারছি না কেন এই উত্তরটির আরও বেশি উত্স নেই, সোজা এবং বিন্দুতে! সাবাশ!
বাতিস্তা

4
মাইইনভলপ হ'ল আপনি ওয়েব পরিষেবাটির মাধ্যমে প্রেরণ করছেন। আমি বর্ণিত হিসাবে এটি কাজ করতে বেশ পেলাম না (বিশেষত টেক্সট রাইটার.টাস্ট্রিং ফাংশন) তবে এটি আমার উদ্দেশ্যগুলির জন্য ডিবাগ মোডে যথেষ্ট কাজ করেছে যাতে আপনি সিরিয়াল হিসাবে কল করার পরে আপনি কাঁচা এক্সএমএল দেখতে পাবেন। এই উত্তরটির জন্য খুব বেশি প্রশংসা করুন, কারণ অন্য কেউ কেউ মিশ্র ফলাফল নিয়ে কাজ করেছেন (ওয়েবকনফিগ ব্যবহার করে লগিং কেবল উদাহরণস্বরূপ এক্সএমএল এর কিছু অংশ ফেরত দিয়েছিল, এবং এটিও পার্স করা খুব সহজ ছিল না)।
ব্যবহারকারী 2366842

@ বিমারবাউন্ড: এটি কি কোনও এনক্রিপ্ট করা ভিপিএন এর মাধ্যমে সুরক্ষিত সাবান বার্তাগুলি দিয়ে কাজ করবে?
আমাদের ম্যান

7
এই উত্তরটি সাবান খাম তৈরি করে না, এটি কেবল এক্সএমএলকে সিরিয়ালাইজ করে। কীভাবে সাবান খামের অনুরোধ পাবেন?
আলী কারাকা

21

Fiddler2 ব্যবহার করে দেখুন এটি আপনাকে অনুরোধ এবং প্রতিক্রিয়া পরিদর্শন করতে দেবে। এটি লক্ষ্য করার মতো বিষয় যে ফিডলার এইচপি এবং https উভয় ট্র্যাফিকের সাথেই কাজ করে।


এটি একটি https এনক্রিপ্ট করা পরিষেবা
অ্যান্ড্রু হ্যারি

8
ফিডলার https ট্র্যাফিকটি এনক্রিপ্ট করতে পারেন
অ্যারন ফিশার

4
এই সমাধানটি আমি ওয়েবে / app.config এ ট্রেসিংয়ের চেয়ে আরও ভাল বলে মনে করেছি। ধন্যবাদ!
andyuk

4
তবে কনফিগ ফাইলে system.diagnostics ব্যবহারের জন্য তৃতীয় পক্ষের অ্যাপটি ইনস্টল করার প্রয়োজন নেই
Azat

4
@ অ্যারোনফিশার: ফিডলার কি কোনও এনক্রিপ্ট করা ভিপিএন-এর মাধ্যমে সাবান বার্তার সাহায্যে কাজ করবে?
আমাদের কলা

6

দেখে মনে হচ্ছে ওয়েব রেফারেন্সে কল ব্যতিক্রম ছড়িয়ে দিলে টিম কার্টারের সমাধানটি কাজ করে না। আমি কাঁচা ওয়েব রেজোনেসে পৌঁছানোর চেষ্টা করছি যাতে ব্যতিক্রম ছোঁড়ার পরে আমি ত্রুটি হ্যান্ডলারে এটি (কোডে) পরীক্ষা করতে পারি। তবে, আমি দেখতে পাচ্ছি যে টিমের পদ্ধতি দ্বারা লিখিত প্রতিক্রিয়া লগ ফাঁকা রয়েছে যখন কলটি ব্যতিক্রম ছুঁড়ে দেয়। আমি কোডটি পুরোপুরি বুঝতে পারি না, তবে এটি প্রদর্শিত হয় যে টিমের পদ্ধতিটি সেই বিন্দুটির পরে প্রক্রিয়াতে কাটবে যেখানে নেট ইতিমধ্যে ওয়েব প্রতিক্রিয়াটিকে অবৈধ এবং বাতিল করে দিয়েছে।

আমি এমন ক্লায়েন্টের সাথে কাজ করছি যা নিম্ন স্তরের কোডিং সহ ম্যানুয়ালি একটি ওয়েব পরিষেবা বিকাশ করছে। এই মুহুর্তে, তারা তাদের অভ্যন্তরীণ প্রক্রিয়া ত্রুটি বার্তাগুলি এইচটিএমএল ফর্ম্যাট বার্তাগুলি হিসাবে প্রতিক্রিয়ার মধ্যে যোগ করছে 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
    }
}

আপনি যদি সোপম্যাসেজ.স্ট্রিমটি সন্ধান করেন তবে এটি কেবল পঠনযোগ্য স্ট্রিম হিসাবে মনে করা হবে যা আপনি এই সময়ে ডেটা পরিদর্শন করতে ব্যবহার করতে পারেন। আপনি যদি স্ট্রিমটি পড়েন, পরবর্তী কোনও প্রক্রিয়াকরণ বোমা কোনও ডেটা ত্রুটি না পাওয়া (স্ট্রিমটি শেষ ছিল) এবং আপনি অবস্থানটি শুরুতে পুনরায় সেট করতে পারবেন না তবে এটি একটি স্ক্রু-আপ কারণ।

মজার বিষয় হল, আপনি যদি দুটি পদ্ধতি, চেনস্ট্রিম এবং প্রসেসমেজ উপায়গুলি করেন তবে প্রসেসমেজ পদ্ধতিটি কাজ করবে কারণ আপনি কানট্রিম স্ট্রিম থেকে চেনস্ট্রিমের মেমরিস্ট্রিমে স্ট্রিমের ধরন পরিবর্তন করেছেন এবং মেমরিস্ট্রিম অপারেশনগুলি সন্ধান করতে দেয় না। (আমি কানেক্টস্ট্রিমকে মেমোরিস্ট্রিমে কাস্ট করার চেষ্টা করেছি - অনুমতি দেওয়া হয়নি।)

সুতরাং ..... মাইক্রোসফ্টকে হয় চেইনস্ট্রিম প্রকারে অপারেশনগুলি সন্ধান করতে হবে বা সোপম্যাসেজ করা উচিত St স্ট্রিমটি সত্যই একটি পঠনযোগ্য অনুলিপি হিসাবে অনুমিত হওয়া উচিত। (আপনার কংগ্রেসম্যান ইত্যাদি লিখুন ...)

আরও একটি বিষয়। কোনও ব্যতিক্রমের পরে কাঁচা এইচটিটিপি প্রতিক্রিয়া পুনরুদ্ধার করার একটি উপায় তৈরি করার পরেও আমি এখনও পূর্ণ প্রতিক্রিয়া পাইনি (কোনও HTTP স্নিফার দ্বারা নির্ধারিত হিসাবে)। এটি কারণ কারণ যখন ডেভলপমেন্ট ওয়েব পরিষেবা প্রতিক্রিয়ার শুরুতে এইচটিএমএল ত্রুটি বার্তাগুলি যুক্ত করেছিল, তখন এটি সামগ্রী-দৈর্ঘ্যের শিরোনামকে সামঞ্জস্য করে না, সুতরাং সামগ্রী-দৈর্ঘ্যের মানটি প্রকৃত প্রতিক্রিয়া বডির আকারের চেয়ে কম ছিল। আমি যা পেয়েছি তা হ'ল অক্ষরের সামগ্রীর দৈর্ঘ্যের মান সংখ্যা - বাকিগুলি অনুপস্থিত ছিল। স্পষ্টতই, যখন নেট প্রতিক্রিয়া প্রবাহটি পড়ে, এটি কেবলমাত্র কন্টেন্ট-দৈর্ঘ্যের অক্ষরের সংখ্যা পড়ে এবং সামগ্রী-দৈর্ঘ্যের মানটি সম্ভবত ভুল হওয়ার অনুমতি দেয় না। হিসাবে এটি হওয়া উচিত হয়; তবে যদি বিষয়বস্তু-দৈর্ঘ্যের শিরোলেখের মানটি ভুল হয় তবে আপনি এইচটিটিপি স্নিফার সহ পুরো প্রতিক্রিয়া বডিটি পাবেন এমন একমাত্র উপায় (আমি ব্যবহারকারী 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);
        }
    }
}

4
@ টিমকার্টার এটি আমার সাথে কাজ করেছে, আমি মুছে ফেলা একমাত্র জিনিসটি ক্লায়েন্ট অংশ, যা আমাকে একটি কোলনের সাথে একটি নাম দেয়, একটি ব্যতিক্রম ঘটায়। সুতরাং একবার আমি এই লাইনটি মুছে ফেললে, যারা প্রতিটি অনুরোধ / প্রতিক্রিয়ার জন্য একটি ফাইল রাখতে চান তাদের পক্ষে এটি কাজ করে। যুক্ত করার জন্য কেবলমাত্র যুক্তিটি হ'ল সুস্পষ্ট কিছু যা আপনি অন্যান্য উত্তরগুলি পড়েন এবং এটি আপনাকে সাবান-এক্সটেনশন নির্দেশ করতে ওয়েবকনফিগ নোড যুক্ত করতে হবে। ধন্যবাদ!
নেটাদিক্টোস

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

আপনি কোন ভাষাটি ব্যবহার করছেন তা নির্দিষ্ট করেননি তবে সি # / .NET ধরে নিচ্ছেন আপনি এসওএপি এক্সটেনশনগুলি ব্যবহার করতে পারেন ।

অন্যথায়, ওয়িরশার্কের মতো একটি স্নিফার ব্যবহার করুন


4
হ্যাঁ, ওয়্যারশার্ক চেষ্টা করেছেন, এটি আমাকে কেবল শিরোনামের তথ্য প্রদর্শন করতে পারে, সাবান সামগ্রীটি এনক্রিপ্ট করা।
অ্যান্ড্রু হ্যারি

এটি সম্ভবত কারণ আপনি https ব্যবহার করছেন। যতক্ষণ না আমি উচ্চ স্তরের কাজটি মনে করতে পারি তাই সোপ এক্সটেনশনগুলি যাতে আপনার ডিক্রিপ্ট হওয়ার পরে ডেটা দেখতে সক্ষম হয়।
rbrayb

4
ওয়্যারশার্কের পরিবর্তে ফিডলার ব্যবহার করুন, এটি httpsটি বাক্সের বাইরে ডিক্রিপ্ট করে।
রদ্রিগো স্ট্রাস

-1

আমি বুঝতে পেরেছি আমি পার্টিতে বেশ দেরি করেছি, এবং যেহেতু ভাষাটি আসলে নির্দিষ্ট করা হয়নি, বিমারবাউন্ডের উত্তরের ভিত্তিতে এখানে একটি ভিবি.এনইটি সমাধান রয়েছে, যদি কেউ এর মধ্যেও হোঁচট খায় এবং এর সমাধানের প্রয়োজন হয় তবে। দ্রষ্টব্য: আপনার প্রকল্পটিতে স্ট্রিংবিল্ডার শ্রেণীর একটি রেফারেন্স থাকা দরকার, যদি আপনি ইতিমধ্যে না থাকেন।

 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

কেবলমাত্র ফাংশনটি কল করুন এবং এটি ওয়েব সার্ভিসে আপনি যে বস্তুটি পাস করার চেষ্টা করছেন তার সিরিয়ালযুক্ত এক্সএমএল দিয়ে একটি স্ট্রিং ফিরে আসবে (বাস্তবে, এটি যে কোনও বস্তুতেও আপনি ফেলে দেওয়ার যত্ন নিয়ে কাজ করেন)।

পার্শ্ব নোট হিসাবে, এক্সএমএল ফিরিয়ে দেওয়ার আগে ফাংশনে রিপ্লেস কলটি আউটপুট থেকে vbCrLf অক্ষর ফেলা হয়। আমার উত্পাদিত এক্সএমএল এর মধ্যে তাদের একটি গুচ্ছ ছিল তবে এটি আপনি ক্রমিকায়িত করার চেষ্টা করছেন তার উপর নির্ভর করে স্পষ্টতই আলাদা হবে এবং আমি মনে করি যে ওয়েব পরিষেবায় প্রেরণ করার সময় সেগুলি ছিনিয়ে নিতে পারে।


যে আমাকে ডাউনটাতে থাপ্পর মেরেছে, দয়া করে বিনা দ্বিধায় আমাকে জানান যে আমি কী অনুপস্থিত / কী কী উন্নতি করা যেতে পারে।
ব্যবহারকারী 2366842
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.