Search code examples
loggingasp.net-web-apitracediagnostics

How do I enable WebAPI response tracing?


I have a service built on WebAPI 4.0 but we have an issue with some clients receiving JSON instead of XML, how can I see what's going on inside the WebAPI on the live service?


Solution

  • Ensure that the compiled and deployed code base has this set:

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // etc.
    
            config.EnableSystemDiagnosticsTracing();
    
            // etc.
        }
    }
    

    Then add this to your Web.config file:

    <configuration>
      <system.diagnostics>
        <trace autoflush="false" indentsize="4">
          <listeners>
            <add name="myListener" 
              type="System.Diagnostics.TextWriterTraceListener" 
              initializeData="E:\CompressedLogs\Service1-WebApi-TraceOutput.log" />
            <remove name="Default" />
          </listeners>
        </trace>
      </system.diagnostics>
    </configuration>
    

    You should see this stuff in the log file:

    w3wp.exe Information: 0 : Request, Method=GET, Url=http://MonkeyChops.potato.org/v1/PantsSpiderman/431?api_key=0, Message='http://MonkeyChops.potato.org/v1/PantsSpiderman/431?api_key=0'
    w3wp.exe Information: 0 : Message='PantsSpiderman', Operation=DefaultHttpControllerSelector.SelectController
    w3wp.exe Information: 0 : Message='Spandex.MonkeyChops.WebApi.Controllers.PantsSpidermanController', Operation=DefaultHttpControllerActivator.Create
    w3wp.exe Information: 0 : Message='Spandex.MonkeyChops.WebApi.Controllers.PantsSpidermanController', Operation=HttpControllerDescriptor.CreateController
    w3wp.exe Information: 0 : Message='Selected action 'Get(String id)'', Operation=ApiControllerActionSelector.SelectAction
    w3wp.exe Information: 0 : Message='Parameter 'id' bound to the value '431'', Operation=ModelBinderParameterBinding.ExecuteBindingAsync
    w3wp.exe Information: 0 : Message='Model state is valid. Values: id=431', Operation=HttpActionBinding.ExecuteBindingAsync
    w3wp.exe Information: 0 : Message='Will use same 'XmlMediaTypeFormatter' formatter', Operation=XmlMediaTypeFormatter.GetPerRequestFormatterInstance
    w3wp.exe Information: 0 : Message='Selected formatter='XmlMediaTypeFormatter', content-type='text/xml; charset=utf-8'', Operation=DefaultContentNegotiator.Negotiate
    w3wp.exe Information: 0 : Message='Action returned 'StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.ObjectContent`1[[Spandex.MonkeyChops.Models.Pants.result, Spandex.MonkeyChops.WebApi, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], Headers:
    {
      Cache-Control: public, must-revalidate, max-age=86400
      Content-Type: text/xml; charset=utf-8
    }'', Operation=ReflectedHttpActionDescriptor.ExecuteAsync
    w3wp.exe Information: 0 : Operation=ApiControllerActionInvoker.InvokeActionAsync, Status=200 (OK)
    w3wp.exe Information: 0 : Operation=PantsSpidermanController.ExecuteAsync, Status=200 (OK)
    w3wp.exe Information: 0 : Response, Status=200 (OK), Method=GET, Url=http://MonkeyChops.potato.org/v1/PantsSpiderman/431?api_key=0, Message='Content-type='text/xml; charset=utf-8', content-length=unknown'
    w3wp.exe Information: 0 : Operation=XmlMediaTypeFormatter.WriteToStreamAsync
    w3wp.exe Information: 0 : Operation=PantsSpidermanController.Dispose