লগিং অনুরোধ / প্রতিক্রিয়া বার্তাগুলি HTTPClient ব্যবহার করার সময়


114

আমার একটি পদ্ধতি রয়েছে যা নীচের মতো পোষ্ট করে

var response = await client.PostAsJsonAsync(url, entity);

if (response.IsSuccessStatusCode)
{
        // read the response as strongly typed object
        return await response.Content.ReadAsAsync<T>();
}

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

উত্তর:


196

আপনি কীভাবে এটি করতে পারেন তার একটি উদাহরণ:

কিছু নোট:

  • LoggingHandlerঅনুরোধটি হ্যান্ডল করার আগে বাধা দেয় HttpClientHandlerযা শেষ পর্যন্ত তারে লিখিত হয়।

  • PostAsJsonAsyncঅভ্যন্তরীণভাবে এক্সটেনশানটি একটি তৈরি করে ObjectContentএবং যখন ReadAsStringAsync()ডাকে বলা হয় LoggingHandler, এটি অভ্যন্তরের ObjectContentবিন্যাসটিকে বস্তুটি সিরিয়ালায়িত করে তোলে এবং এজন্য আপনি জসনটিতে সামগ্রীটি দেখছেন।

লগিং হ্যান্ডলার:

public class LoggingHandler : DelegatingHandler
{
    public LoggingHandler(HttpMessageHandler innerHandler)
        : base(innerHandler)
    {
    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        Console.WriteLine("Request:");
        Console.WriteLine(request.ToString());
        if (request.Content != null)
        {
            Console.WriteLine(await request.Content.ReadAsStringAsync());
        }
        Console.WriteLine();

        HttpResponseMessage response = await base.SendAsync(request, cancellationToken);

        Console.WriteLine("Response:");
        Console.WriteLine(response.ToString());
        if (response.Content != null)
        {
            Console.WriteLine(await response.Content.ReadAsStringAsync());
        }
        Console.WriteLine();

        return response;
    }
}

উপরের লগিংহ্যান্ডলারটি এইচটিপিপিপ্লায়েন্টের সাথে চেইন করুন :

HttpClient client = new HttpClient(new LoggingHandler(new HttpClientHandler()));
HttpResponseMessage response = client.PostAsJsonAsync(baseAddress + "/api/values", "Hello, World!").Result;

আউটপুট:

Request:
Method: POST, RequestUri: 'http://kirandesktop:9095/api/values', Version: 1.1, Content: System.Net.Http.ObjectContent`1[
[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], Headers:
{
  Content-Type: application/json; charset=utf-8
}
"Hello, World!"

Response:
StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Date: Fri, 20 Sep 2013 20:21:26 GMT
  Server: Microsoft-HTTPAPI/2.0
  Content-Length: 15
  Content-Type: application/json; charset=utf-8
}
"Hello, World!"

3
আপনার যদি অনুরোধের বিশদ প্রয়োজন হয় তবে এটি দুর্দান্ত তবে এটি সার্ভারে সঠিক অনুরোধ প্রেরণে ব্যর্থ। আপনার যদি সার্ভারে প্রেরিত সমস্ত বাইটের সঠিকভাবে প্রয়োজন হয় তবে এটি এইভাবে কাজ করবে না।
ম্যাথেক

1
কেন new HttpClientHandler()? এটি সরকারী দস্তাবেজগুলিতে উপস্থিত নেই: ডকস.মাইক্রোসফটকম
en-

1
আহ, অভ্যন্তরীণ হ্যান্ডলারটি শূন্য হওয়া সম্পর্কে স্পষ্টতই তার ব্যতিক্রম না হওয়া দরকার ...
জিরো 3

3
আপনি মেসেজপ্রসেসিংহ্যান্ডলারকে ওভাররাইড করতে পারেন যা কল করার আগে এবং পরে মূলত আপনার জন্য একটি ProcessRequestএবং ProcessResponseপদ্ধতি SendAsyncকল করে।
IllusiveBrian

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

50

Http://mikehadlow.blogspot.com/2012/07/tracing-systemnet-to-debug-http-clients.html দেখুন

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

<system.diagnostics>
  <trace autoflush="true" />
  <sources>
    <source name="System.Net">
      <listeners>
        <add name="MyTraceFile"/>
        <add name="MyConsole"/>
      </listeners>
    </source>
  </sources>
  <sharedListeners>
    <add
      name="MyTraceFile"
      type="System.Diagnostics.TextWriterTraceListener"
      initializeData="System.Net.trace.log" />
    <add name="MyConsole" type="System.Diagnostics.ConsoleTraceListener" />
  </sharedListeners>
  <switches>
    <add name="System.Net" value="Verbose" />
  </switches>
</system.diagnostics>

2
এটি একটি দুর্দান্ত সমাধান, কিছু গবেষণা এবং ভাগ করে নেওয়ার জন্য আপনাকে ধন্যবাদ।
পাইওয়াফ

এটা কিভাবে কাজ করে ? আমি কপি <system.diagnostics>মধ্যে app.configঅধীনে <configuration>কিন্তু binফোল্ডারের কোন লগ ফাইল এবং কনসোল আউটপুট কিছু খুব প্রদর্শন করবে না, আমি কি অনুপস্থিত করছি?
মুফ্লিক্স

1
@ মুফ্লিক্স, আপনি যে ডকুমেন্টেশনটি আমার উত্তরের শীর্ষে উল্লেখ করা পৃষ্ঠায় লিঙ্কযুক্ত পড়তে পারেন। আমি মনে করি যে initializeDataঅ্যাট্রিবিউটে উল্লিখিত ফাইলটির নাম আপনি চালানো এক্সিকিউটেবলের বর্তমান কার্যনির্বাহী ডিরেক্টরিতে তৈরি করা হবে, তাই আপনি আপনার পরিবেশে কোন পথে রয়েছে তা যাচাই করতে চাইতে পারেন।
রামি এ

11

নেটওয়ার্ক ট্রেসিং পরবর্তী বস্তুর জন্যও পাওয়া যায় ( এমএসডিএন- তে নিবন্ধ দেখুন )

  • সিস্টেম.নেট.সকেটস সকেট, টিসিপিপ্লাইটার, টিসিপিসিলেট এবং ডিএনএস ক্লাসের কয়েকটি পাবলিক পদ্ধতি
  • সিস্টেম.নেট HTTPWebRequest, HttpWebResponse, FtpWebRequest, এবং FtpWebResponse ক্লাসগুলির কয়েকটি পাবলিক পদ্ধতি এবং এসএসএল ডিবাগ তথ্য (অবৈধ শংসাপত্র, নিখরচায়কারীর তালিকা, এবং ক্লায়েন্ট শংসাপত্রের ত্রুটি))
  • System.Net.HttpListener এইচটিটিপিপ্লাইটার, এইচটিপিপ্লাইস্টাররেইকেষ্ট এবং এইচটিপিপ্লাইস্টাররেসপনস ক্লাসের কয়েকটি পাবলিক পদ্ধতি।
  • System.Net.Cache System.Net.Cache- এ কিছু ব্যক্তিগত এবং অভ্যন্তরীণ পদ্ধতি।
  • সিস্টেম.নেট.এইচটিপি এইচটিপিপি্লিয়েন্ট, ডেলিগেটিংহ্যান্ডলার, এইচটিপিপ্লিনেন্টহ্যান্ডলার, এইচটিপি ম্যাসেজহ্যান্ডলার, মেসেজপ্রসেসিংহ্যান্ডলার এবং ওয়েবরেক্সেস্টহ্যান্ডলার ক্লাসের কয়েকটি পাবলিক পদ্ধতি
  • System.Net.WebSockets.WebSket ক্লায়েন্ট ওয়েবসকেট এবং ওয়েবসকেট ক্লাসের কয়েকটি পাবলিক পদ্ধতি।

কনফিগারেশন ফাইলে কোডের পরবর্তী লাইন রাখুন

<configuration>  
  <system.diagnostics>  
    <sources>  
      <source name="System.Net" tracemode="includehex" maxdatasize="1024">  
        <listeners>  
          <add name="System.Net"/>  
        </listeners>  
      </source>  
      <source name="System.Net.Cache">  
        <listeners>  
          <add name="System.Net"/>  
        </listeners>  
      </source>  
      <source name="System.Net.Http">  
        <listeners>  
          <add name="System.Net"/>  
        </listeners>  
      </source>  
      <source name="System.Net.Sockets">  
        <listeners>  
          <add name="System.Net"/>  
        </listeners>  
      </source>  
      <source name="System.Net.WebSockets">  
        <listeners>  
          <add name="System.Net"/>  
        </listeners>  
      </source>  
    </sources>  
    <switches>  
      <add name="System.Net" value="Verbose"/>  
      <add name="System.Net.Cache" value="Verbose"/>  
      <add name="System.Net.Http" value="Verbose"/>  
      <add name="System.Net.Sockets" value="Verbose"/>  
      <add name="System.Net.WebSockets" value="Verbose"/>  
    </switches>  
    <sharedListeners>  
      <add name="System.Net"  
        type="System.Diagnostics.TextWriterTraceListener"  
        initializeData="network.log"  
      />  
    </sharedListeners>  
    <trace autoflush="true"/>  
  </system.diagnostics>  
</configuration>  

-14

সবচেয়ে সহজ সমাধানটি হবে ওয়্যারশার্ক ব্যবহার করা এবং এইচটিটিপি টিসিপি প্রবাহটি সনাক্ত করা।


8
এমন একটি বিশ্ব কল্পনা করুন যেখানে এই ধরণের সংযোগগুলির বেশিরভাগই আসলে HTTPS PS
ফ্রেট করুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.