コード例 #1
0
        public void ReleaseLock(PessimisticConcurrencyContext lockContext)
        {
            if (string.IsNullOrWhiteSpace(lockContext.LockId))
            {
                throw new ArgumentNullException("lockContext.LockId", "LockId cannot be null or empty");
            }
            CloudBlockBlob blob            = this.Container.GetBlockBlobReference(lockContext.ObjectId);//here
            var            accessCondition = AccessCondition.GenerateLeaseCondition(lockContext.LockId);

            blob.ReleaseLease(accessCondition);
        }
コード例 #2
0
        public bool AcquireLock(PessimisticConcurrencyContext lockContext)
        {
            var request = BlobRequest.Lease(this.GetUri(lockContext.ObjectId), BlobRequestTimeout, LeaseAction.Acquire, null);

            this.Account.Credentials.SignRequest(request);

            // add extra headers not supported by SDK - not supported by emulator yet (SDK 1.7)
            ////request.Headers["x-ms-version"] = "2012-02-12";
            ////request.Headers.Add("x-ms-lease-duration", lockContext.Duration.TotalSeconds.ToString());

            try
            {
                using (var response = request.GetResponse())
                {
                    if (response is HttpWebResponse &&
                        HttpStatusCode.Created.Equals((response as HttpWebResponse).StatusCode))
                    {
                        lockContext.LockId = response.Headers["x-ms-lease-id"];
                        return(true);
                    }
                    else
                    {
                        return(false);
                    }
                }
            }
            catch (WebException e)
            {
                TraceHelper.TraceWarning("Warning acquiring blob '{0}' lease: {1}", lockContext.ObjectId, e.Message);
                if (WebExceptionStatus.ProtocolError.Equals(e.Status))
                {
                    if (e.Response is HttpWebResponse)
                    {
                        if (HttpStatusCode.NotFound.Equals((e.Response as HttpWebResponse).StatusCode))
                        {
                            lockContext.LockId = null;
                            return(true);
                        }
                        else if (HttpStatusCode.Conflict.Equals((e.Response as HttpWebResponse).StatusCode))
                        {
                            lockContext.LockId = null;
                            return(false);
                        }
                    }
                    throw;
                }
                return(false);
            }
            catch (Exception e)
            {
                TraceHelper.TraceError("Error acquiring blob '{0}' lease: {1}", lockContext.ObjectId, e.Message);
                throw;
            }
        }
コード例 #3
0
        public void ReleaseLock(PessimisticConcurrencyContext lockContext)
        {
            if (string.IsNullOrWhiteSpace(lockContext.LockId))
            {
                throw new ArgumentNullException("lockContext.LockId", "LockId cannot be null or empty");
            }

            var request = BlobRequest.Lease(this.GetUri(lockContext.ObjectId), BlobRequestTimeout, LeaseAction.Release, lockContext.LockId);

            this.Account.Credentials.SignRequest(request);

            using (var response = request.GetResponse())
            {
                if (response is HttpWebResponse &&
                    !HttpStatusCode.OK.Equals((response as HttpWebResponse).StatusCode))
                {
                    TraceHelper.TraceError("Error releasing blob '{0}' lease: {1}", lockContext.ObjectId, (response as HttpWebResponse).StatusDescription);
                    throw new InvalidOperationException((response as HttpWebResponse).StatusDescription);
                }
            }
        }
コード例 #4
0
        public bool AcquireLock(PessimisticConcurrencyContext lockContext)
        {
            CloudBlockBlob blob = this.Container.GetBlockBlobReference(lockContext.ObjectId);

            TimeSpan?leaseTime = TimeSpan.FromSeconds(BlobRequestTimeout); //Acquire a 15 second lease on the blob. Leave it null for infinite lease. Otherwise it should be between 15 and 60 seconds.

            try
            {
                lockContext.LockId = blob.AcquireLease(leaseTime, null);
                return(true);
            }
            catch (StorageException e)
            {
                TraceHelper.TraceWarning("Warning acquiring blob '{0}' lease: {1}", lockContext.ObjectId, e.Message);
                var requestInformation = e.RequestInformation;
                var statusCode         = (System.Net.HttpStatusCode)requestInformation.HttpStatusCode;//request
                if (statusCode == HttpStatusCode.NotFound)
                {
                    lockContext.LockId = null;
                    TraceHelper.TraceWarning(e.TraceInformation());
                    return(true);
                }
                else if (HttpStatusCode.Conflict.Equals(statusCode))
                {
                    lockContext.LockId = null;
                    return(false);
                }

                TraceHelper.TraceError(e.TraceInformation());
                return(false);
            }
            catch (Exception e)
            {
                TraceHelper.TraceError("Error acquiring blob '{0}' lease: {1}", lockContext.ObjectId, e.Message);
                throw;
            }
        }