public static ReturnType Create <ReturnType>()
    {
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(
            string.Format("{0}/Create?EntityName='{1}'",
                          sUri.TrimEnd('/'),
                          typeof(ReturnType).Name)
            );
        NetworkCredential serviceCreds = new NetworkCredential(UserName, Password);
        CredentialCache   cache        = new CredentialCache();

        cache.Add(new Uri(sUri), "Basic", serviceCreds);

        req.Credentials = cache;
        req.Method      = "GET";
        req.ContentType = "application/xml";
        req.Timeout     = 1000 * 60 * 15; // 15 minutes

        try
        {
            HttpWebResponse resp     = (HttpWebResponse)req.GetResponse();
            var             response = new StreamReader(resp.GetResponseStream()).ReadToEnd();
            //XDocument doc = XDocument.Load(resp.GetResponseStream());
            XDocument doc = XDocument.Parse(response);

            resp.Close();
            ReturnType oEntity = doc.Root.ToString().ToBusinessEntity <ReturnType>(SourceFormatEnum.XML);
            return(oEntity);
        }
        catch (WebException wex)
        {
            throw DataServiceExceptionUtil.ParseException(wex);
        }
    }
    public static string FileUpload(byte[] fileContent, string TargetFileName)
    {
        HttpWebRequest    req          = (HttpWebRequest)WebRequest.Create(sUri.TrimEnd('/') + "/FileUpload?fileName='" + TargetFileName + "'");
        NetworkCredential serviceCreds = new NetworkCredential(UserName, Password);
        CredentialCache   cache        = new CredentialCache();
        Uri uri = new Uri(sUri);

        cache.Add(uri, "Basic", serviceCreds);
        req.Credentials = cache;
        req.Method      = "POST";
        req.Timeout     = 1000 * 60 * 20; // 20 minutes
        req.SendChunked = true;

        req.ContentLength = fileContent.Length;
        Stream reqStrm = req.GetRequestStream();

        reqStrm.Write(fileContent, 0, fileContent.Length);
        reqStrm.Close();

        try
        {
            HttpWebResponse resp     = (HttpWebResponse)req.GetResponse();
            var             response = new StreamReader(resp.GetResponseStream()).ReadToEnd();
            //XDocument doc = XDocument.Load(resp.GetResponseStream());
            XDocument doc = XDocument.Parse(response);
            resp.Close();
            return(doc.Root.Value);
        }
        catch (WebException wex)
        {
            throw DataServiceExceptionUtil.ParseException(wex);
        }
    }
    private static ReturnType DoPost <ReturnType>(string SvcOperName, object o, bool enableAuthentication)
    {
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(sUri.TrimEnd('/') + "/" + SvcOperName);

        if (enableAuthentication)
        {
            NetworkCredential serviceCreds = new NetworkCredential(UserName, Password);
            CredentialCache   cache        = new CredentialCache();
            Uri uri = new Uri(sUri);
            cache.Add(uri, "Basic", serviceCreds);
            req.Credentials = cache;
        }

        req.Method = "POST";
        //req.ContentType = "application/x-www-form-urlencoded";
        req.ContentType = "application/xml";
        req.Timeout     = 1000 * 60 * 15; // 15 minutes

        byte[] arr = o.ToSerializedByteArrayUTF8();
        req.ContentLength = arr.Length;
        Stream reqStrm = req.GetRequestStream();

        reqStrm.Write(arr, 0, arr.Length);
        reqStrm.Close();

        try
        {
            HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

            var stream = resp.GetResponseStream();

            if (stream.CanRead)
            {
                var response = new StreamReader(stream).ReadToEnd();
                //XDocument doc = XDocument.Load(stream);
                XDocument doc = XDocument.Parse(response);
                resp.Close();
                ReturnType oResp = doc.Root.ToString().ToBusinessEntity <ReturnType>(SourceFormatEnum.XML);
                return(oResp);
            }
            else
            {
                return(default(ReturnType));
            }
        }
        catch (WebException wex)
        {
            throw DataServiceExceptionUtil.ParseException(wex);
        }
    }
    public static ReturnType Delete <ReturnType>(object entityToDelete)
    {
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(
            string.Format("{0}/Delete?EntityName='{1}'",
                          sUri.TrimEnd('/'),
                          typeof(ReturnType).Name)
            );
        NetworkCredential serviceCreds = new NetworkCredential(UserName, Password);
        CredentialCache   cache        = new CredentialCache();
        Uri uri = new Uri(sUri);

        cache.Add(uri, "Basic", serviceCreds);

        req.Credentials = cache;
        req.Method      = "POST";
        req.ContentType = "application/xml";
        req.Timeout     = 1000 * 60 * 15; // 15 minutes

        byte[] arr = entityToDelete.ToSerializedByteArrayUTF8();
        req.ContentLength = arr.Length;
        Stream reqStrm = req.GetRequestStream();

        reqStrm.Write(arr, 0, arr.Length);
        reqStrm.Close();

        try
        {
            HttpWebResponse resp     = (HttpWebResponse)req.GetResponse();
            var             response = new StreamReader(resp.GetResponseStream()).ReadToEnd();
            //XDocument doc = XDocument.Load(resp.GetResponseStream());
            XDocument doc = XDocument.Parse(response);
            resp.Close();
            ReturnType oResp = doc.Root.ToString().ToBusinessEntity <ReturnType>(SourceFormatEnum.XML);
            return(oResp);
        }
        catch (WebException wex)
        {
            throw DataServiceExceptionUtil.ParseException(wex);
        }
    }
        /// <summary>
        /// Delegate for invoking networking operations with retry.
        /// </summary>
        /// <param name="operation">the operation to invoke with retry</param>
        private void InvokeOperationWithRetry(Action operation)
        {
            int retryremaining = Constants.MaxRetryAttempts;

            while (retryremaining > 0)
            {
                try
                {
                    operation();

                    // The operation is successful, so retryremaining=0
                    retryremaining = 0;
                }
                catch (Exception ex)
                {
                    // Operation not successful

                    // De-serialize error message to check the error code from AzureAD Service
                    ErrorResponseEx parsedException = DataServiceExceptionUtil.DeserializeErrorMessage(ex);
                    if (parsedException == null)
                    {
                        // Could not parse the exception so it wasn't in the format of DataServiceException
                        throw ex;
                    }
                    else
                    {
                        // Look at the error code to determine if we want to retry on this exception
                        switch (parsedException.Code)
                        {
                        // These are the errors we dont want to rety on
                        // Please look at the definistions for details about each of these
                        case Constants.MessageIdAuthorizationIdentityDisabled:
                        case Constants.MessageIdAuthorizationIdentityNotFound:
                        case Constants.MessageIdAuthorizationRequestDenied:
                        case Constants.MessageIdBadRequest:
                        case Constants.MessageIdBindingRedirectionInternalServerError:
                        case Constants.MessageIdContractVersionHeaderMissing:
                        case Constants.MessageIdHeaderNotSupported:
                        case Constants.MessageIdInternalServerError:
                        case Constants.MessageIdInvalidDataContractVersion:
                        case Constants.MessageIdInvalidReplicaSessionKey:
                        case Constants.MessageIdInvalidRequestUrl:
                        case Constants.MessageIdMediaTypeNotSupported:
                        case Constants.MessageIdMultipleObjectsWithSameKeyValue:
                        case Constants.MessageIdObjectNotFound:
                        case Constants.MessageIdResourceNotFound:
                        case Constants.MessageIdThrottledPermanently:
                        case Constants.MessageIdThrottledTemporarily:
                        case Constants.MessageIdUnauthorized:
                        case Constants.MessageIdUnknown:
                        case Constants.MessageIdUnsupportedQuery:
                        case Constants.MessageIdUnsupportedToken:
                        {
                            retryremaining = 0;

                            // We just create a new expection with the msg
                            // and throw it so that the 'OnException' handler handles it
                            throw new InvalidOperationException(parsedException.Message, ex);
                        }

                        // This exception means that the user's data is not in current DataCenter,
                        // special handling is required for this exception
                        case Constants.MessageIdBindingRedirection:
                        {
                            HandleBindingRedirectionException(parsedException, operation);
                            retryremaining = 0;
                            break;
                        }

                        // This means that the replica we were trying to go to was unavailable,
                        // retry will possibly go to another replica and may work
                        case Constants.MessageIdReplicaUnavailable:
                        {
                            retryremaining--;
                            break;
                        }

                        // This means that the token has expired.
                        case Constants.MessageIdExpired:
                        {
                            // authHeader = GetAuthorizationHeader();
                            retryremaining--;
                            break;
                        }
                        }
                    }
                }
            }
        }