Displaying Http Requests from Self-Hosted WCF Services

 

This is a short one, I promise. A colleague was complaining that NetExt command !whttp was not displaying the active/finished requests on a dump file he was sure it was processing http requests. The truth is that the process was not w3wp.exe (IIS Worker Process) but rather a self-hosted WCF service. The command !whttp relies on System.Web.HttpContext class which is the class used by IIS managed applications to control request and response. Self-hosted WCF Services rely on System.Net.HttpListenerContext class instead. There is no specialized command for that in NetExt but this does not prevent anyone from creating their own query which I show below. If you are interested but have no idea what I am talking about, check this out before you decide it is indeed not something you may be interested in: https://blogs.msdn.com/b/rodneyviana/archive/2015/03/10/getting-started-with-netext.aspx

Command

This is my suggestion of query. Unlike HttpContext, the HttpListenerContext class does not offer a reliable timestamp of the request time, so things like time running and request time are not included. If someone can come up with a way to do this, please let the rest of us know in the comments and I will update the command and give praise to the brave researcher.

The command on a easy to copy-and-paste form:

!wfrom -nospace -nofield -type System.Net.HttpListenerContext where(!m_Request.m_IsDisposed) $addr()," ",$if($stackroot($addr()) == ""," ---",$lpad($split($stackroot($addr()),",",0),4))," ",$rpad($if(m_Response,$enumname(m_Response.m_ResponseState),"Finished"),12),$if(m_Response,$replace($lpad(m_Response.m_NativeResponse.StatusCode,5),"0n"," ")," ---")," ",$rpad($if(m_Request,m_Request.m_HttpMethod,"NA"),8)," ",$isnull(m_request.m_RequestUri.m_String,m_request.m_RawUrl)

Below is the output, the headers are included for clarity purposes, it is not part of the normal output.

  1: !wfrom  -nospace -nofield -type System.Net.HttpListenerContext where(!m_Request.m_IsDisposed) $addr()," ",$if($stackroot($addr()) == ""," ---",$lpad($split($stackroot($addr()),",",0),4))," ",$rpad($if(m_Response,$enumname(m_Response.m_ResponseState),"Finished"),12),$if(m_Response,$replace($lpad(m_Response.m_NativeResponse.StatusCode,5),"0n"," ")," ---")," ",$rpad($if(m_Request,m_Request.m_HttpMethod,"NA"),8)," ",$isnull(m_request.m_RequestUri.m_String,m_request.m_RawUrl)
  2:  
  3: Address        Thread State    Status Verb Url
  4: ==========================================================================================
  5: 00000050D5AEAD58  --- Finished    --- POST https://service.contoso.com/Service/JSONService
  6: 00000050D5B53D20   48 SentHeaders 200 POST https://service.contoso.com/Service/JSONService
  7: 00000050D5B58D58  --- Finished    --- POST https://service.contoso.com/Service/JSONService
  8: 00000050D5B5CD38  --- Finished    --- POST https://service.contoso.com/Service/JSONService
  9: 00000050D5B71350  --- Finished    --- POST https://service.contoso.com/Service/JSONService
  10: 00000050D5BE5D20  --- Finished    --- POST https://service.contoso.com/Service/JSONService
  11: 00000050D5BE8D38  --- Finished    --- POST https://service.contoso.com/Service/JSONService
  12: 00000050D5BEED38   58 SentHeaders 200 POST https://service.contoso.com/Service/JSONService
  13: 00000050D5BF0D38  --- Finished    --- POST https://service.contoso.com/Service/JSONService
  14: 00000050D5BF2D50  --- Finished    --- POST https://service.contoso.com/Service/JSONService
  15: 00000050D5BF4D38  --- Finished    --- POST https://service.contoso.com/Service/JSONService
  16: 00000050D5BF6D58  --- Finished    --- POST https://service.contoso.com/Service/JSONService
  17: 00000050D5BF8D38  --- Finished    --- POST https://service.contoso.com/Service/JSONService