1. 程式人生 > >fiddlercore 類庫應用- 檢查客戶端呼叫的服務介面內容.

fiddlercore 類庫應用- 檢查客戶端呼叫的服務介面內容.

fiddlercore是.NET類庫,你可以加入到.NET框架和單框架的應用。 也可以應用到Managed C++公共執行時語言程式中.本次是在 Managed C++ 程式中應用的。 fiddlercore可以捕獲和修改HTTP和HTTPS流量就像Fiddler一樣,但沒有Fiddler的UI。

fiddlercore主要特點

HTTP和HTTPS流量捕獲和修改。

強大的內容過濾和修改的物件模型。

儲存和過載網路流量。

我主要的目的是抓取到某個應用程式內部所有的服務請求. 以檢測各個服務狀態,各個服務介面請求的狀態, 請求介面的url格式, 請求包體,返回包體等內容,這樣輔助部署實施人員能夠排查出應用程式問題,並通過服務的狀態,引數解決掉問題.  比如,可能某個服務關閉當掉,客戶端請求就是返回500以上服務內部錯誤的code值, 400 為服務拒絕客戶端請求,客戶端請求引數不正確等錯誤code值, 200 為請求正確的code。

下面是 應用程式碼. 初始化.

 System::String^ m_CliIp = gcnew System::String("NoSAZ");
  Fiddler::FiddlerApplication::SetAppDisplayName("FiddlerCoreDemoApp");

  EventReceiver^ pR = gcnew EventReceiver;
  pR->pTestDlg= this;
  Fiddler::FiddlerApplication::OnNotification += gcnew EventHandler<NotificationEventArgs^>(pR,&EventReceiver::OnNotification);
  Fiddler::FiddlerApplication::Log->OnLogString += gcnew EventHandler<LogEventArgs^>(pR,&EventReceiver::Log_OnLogString);
  Fiddler::FiddlerApplication::BeforeRequest += gcnew SessionStateHandler(pR,&EventReceiver::BeforeRequest);
  Fiddler::FiddlerApplication::BeforeResponse += gcnew SessionStateHandler(pR,&EventReceiver::BeforeResponse);
  Fiddler::FiddlerApplication::AfterSessionComplete += gcnew SessionStateHandler(pR,&EventReceiver::AfterSessionComplete);

    Fiddler::CONFIG::IgnoreServerCertErrors = false;

  int iPort = 8877;
  Fiddler::FiddlerApplication::Startup(iPort, Fiddler::FiddlerCoreStartupFlags::Default);
  Fiddler::FiddlerApplication::Log->LogFormat("Created endpoint listening on port {0}", iPort);
  Fiddler::FiddlerApplication::Log->LogFormat("Starting with settings: [{0}]", Fiddler::FiddlerCoreStartupFlags::Default);
  Fiddler::FiddlerApplication::Log->LogFormat("Gateway: {0}", CONFIG::UpstreamGateway.ToString());

   System::String^ sSecureEndpointHostname = gcnew System::String("localhost");
  int iSecureEndpointPort = 7777;

  GlobalObjects::oSecureEndpoint
   = Fiddler::FiddlerApplication::CreateProxyEndpoint(iSecureEndpointPort, true, "localhost");

  if (GlobalObjects::oSecureEndpoint)
  {
   Fiddler::FiddlerApplication::Log->LogFormat("開始監控 HTTP 過程 .");
  }

// 抓取過程

public ref struct ArgsReceiver
{
 String^  Argsstrurl;
 String^  ArgsMethod;
 int^  Argsosid;
 SessionStates^  Argsss;
};

public ref struct EventReceiver
{
public:
 class CTest001Dlg* pTestDlg;

 void OnNotification(System::Object^ sender, Fiddler::NotificationEventArgs^ e)
   {
      Console::WriteLine("OnNotification");
   }
    void Log_OnLogString(System::Object^ sender, Fiddler::LogEventArgs ^e)
   {
    pTestDlg->AddMessage(e->LogString);
   }

   void BeforeRequest(Fiddler::Session^ os)//, Fiddler::Session os(Fiddler::Session os)
   {
    }

    void BeforeResponse(Fiddler::Session^ os)//, Fiddler::Session os(Fiddler::Session os)
   {

   }
 
 void AfterSessionComplete(Fiddler::Session^ os)//, Fiddler::Session os(Fiddler::Session os)
   {
    String^  strClientName = os->LocalProcess;
    int index = strClientName->LastIndexOf("ezjcj3");
    if(index > -1)//判斷是ezjcj3發出的請求
    {
   // 將資料傳送道list列表中
   pTestDlg->AddReqToList(os);
    }
   }
 
  };

顯示部分

void CTest001Dlg::AddReqToList(Fiddler::Session^  os)
 {
  try
  {
   //list列表中顯示
  int icount = m_listurl.GetItemCount();

  int ^ osid = os->id; // 請求ID
  System::String^ sid = osid->ToString("G");
  char* ch1 = (char*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(sid);
  int nRow = m_listurl.InsertItem(icount, CString(ch1));//插入行

  String^  strMet =  os->oRequest->headers->HTTPMethod;
  char* ch2 = (char*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(strMet);
  m_listurl.SetItemText(nRow, 1, CString(ch2));//設定資料

  String^  strurl = os->fullUrl;// 整個請求路徑
  ch2 = (char*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(strurl);
  m_listurl.SetItemText(nRow, 2, CString(ch2));//設定資料

  String^  strSt = os->oResponse->headers->HTTPResponseStatus;// 最終狀態
  ch2 = (char*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(strSt);
  m_listurl.SetItemText(nRow, 3, CString(ch2));//設定資料

  String^  strtype = os->oResponse->MIMEType;// 最終狀態
  ch2 = (char*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(strtype);
  m_listurl.SetItemText(nRow,4, CString(ch2));//設定資料

  System::String^ strPath = gcnew String(m_strExePath);
  String^ sFilename1 = System::String::Format("{0}{1}{2}{3}",strPath,"fiddler_log\\",sid,".txt");
  os->SaveResponse(sFilename1,FALSE); // 儲存返回內容
  }
  catch(...)
  {
  }
 }