public TRep TraceRequests <TReq, TRep>(TReq request, Func <TReq, TRep> action) where TReq : DxStoreAccessRequest where TRep : DxStoreAccessReply
        {
            Trace accessClientTracer = ExTraceGlobals.AccessClientTracer;
            bool  flag  = accessClientTracer.IsTraceEnabled(TraceType.DebugTrace);
            bool  flag2 = accessClientTracer.IsTraceEnabled(TraceType.ErrorTrace);

            if (!flag && !flag2)
            {
                return(action(request));
            }
            TRep trep = default(TRep);

            try
            {
                if (flag)
                {
                    string arg = Utils.SerializeObjectToJsonString <TReq>(request, false, true) ?? "<serialization error>";
                    accessClientTracer.TraceDebug <string, string>(0L, "Sending Request: {0}{1}", typeof(TReq).Name, arg);
                }
                trep = action(request);
            }
            catch (Exception ex)
            {
                if (flag2)
                {
                    string arg2 = "<none>";
                    FaultException <DxStoreServerFault> faultException = ex as FaultException <DxStoreServerFault>;
                    if (faultException != null)
                    {
                        DxStoreServerFault detail = faultException.Detail;
                        arg2 = (Utils.SerializeObjectToJsonString <DxStoreServerFault>(detail, false, true) ?? "<serialization error>");
                    }
                    accessClientTracer.TraceDebug <string, string, Exception>(0L, "Send failed - Request: {0} - Fault: {1} - Exception: {2}", typeof(TReq).Name, arg2, ex);
                }
                throw;
            }
            if (flag)
            {
                string arg3 = (trep != null) ? (Utils.SerializeObjectToJsonString <TRep>(trep, false, true) ?? "<serialization error>") : "<null>";
                accessClientTracer.TraceDebug <string, string>(0L, "Received reply: {0}{1}", typeof(TRep).Name, arg3);
            }
            return(trep);
        }