public static async Task <T> CipheriseRequest <T>(this string strRequestURI, HttpStatusCode eExpectedStatus, string strPostJSON, string strSessionID = null, UpdateOut <T> UpdateCB = null) where T : CipheriseError, new()
        {
            try
            {
                T OutData = default(T);  //Lambas cant capture the out/ref Data,  use a temp instead.
                ProcessJSONDelegate JSONDelegate = (HttpStatusCode eStatus, Stream stream) =>
                {
                    if (eExpectedStatus != eStatus)
                    {
                        String.Format("Invalid HTTP status code: '{0}'.  Expecting: '{1}'", eStatus.ToString(), eExpectedStatus.ToString()).TraceWarning();

                        bool           bRet = false;
                        CipheriseError E    = FromJSON <CipheriseError>(stream);
                        if ((E != null) && E.HasError())
                        {
                            E.GetError().TraceError("Cipherise JSON Error: ");

                            OutData = new T();
                            if (UpdateCB != null)
                            {
                                UpdateCB(ref OutData);
                            }
                            OutData.SetError(ref E);
                            bRet = true; //Caller must check T.HasError()
                        }
#if DEBUG
                        {
                            if (stream.CanSeek)
                            {
                                stream.Seek(0, SeekOrigin.Begin);
                            }
                            using (StreamReader streamReader = new StreamReader(stream))
                            {
                                string responseFromServer = streamReader.ReadToEnd();
                                responseFromServer.TraceError("Invalid response: ");
                                streamReader.Close();
                            }
                        }
#endif
                        return(bRet);
                    }

                    //bool bEmptyResponse2 = (OutData is EmptyResponse);
                    bool bEmptyResponse = (typeof(EmptyResponse).IsAssignableFrom(typeof(T)));
                    if (bEmptyResponse)
                    {
                        OutData = new T();  //return an empty response instead of NULL
                        if (UpdateCB != null)
                        {
                            UpdateCB(ref OutData);
                        }
                    }
                    else
                    {
#if DEBUG
                        {
                            byte[] aData = null;
                            using (MemoryStream ms = new MemoryStream())
                            {
                                stream.CopyTo(ms);
                                aData = ms.ToArray();
                                ms.Seek(0, SeekOrigin.Begin);

                                StreamReader reader = new StreamReader(ms);
                                reader.ReadToEnd().TraceVerbose("RESPONSE:  ");
                            }
                            stream = new MemoryStream(aData);
                        }
#endif  //DEBUG

                        bool bValid = false;
                        OutData = FromJSON <T>(stream);
                        if (OutData != null)
                        {
                            if (UpdateCB != null)
                            {
                                UpdateCB(ref OutData);
                            }

                            bValid = OutData.Validate();
                        }

                        if (bValid == false)
                        {
                            String.Format("Invalid data: '{0}'", typeof(T)).TraceError();
                            return(false);
                        }
                    }
                    return(true);
                };

                bool bRequest = await ForticodeRequest(strRequestURI, JSONDelegate, strPostJSON, strSessionID);

                if (bRequest)
                {
                    return(OutData);
                }
            }
            catch (Exception e) { e.CatchMessage().TraceError(); }
            return(null);
        }
 public static async Task <T> CipheriseRequest <T>(this string strRequestURI, string strPostJSON, string strSessionID, UpdateOut <T> UpdateCB = null) where T : CipheriseError, new()
 {
     return(await CipheriseRequest <T>(strRequestURI, HttpStatusCode.OK, strPostJSON, strSessionID, UpdateCB));
 }