user1141368
user1141368

Reputation: 51

Azure Blob Storage Download : Server failed to authenticate, but ok on retry

I'm having a really ODD problem using the client side azure SDK from my local PC.

Using the CloudBlobClient to upload and delete files works like charm, but when trying to download a file I am getting an authentication exception (403 Forbidden basically). However, if I retry the same code it works FINE the next time around.
Does anyone have any idea why???

Here is some simplified code that shows the problem:

    string blobEndpoint = "http://???.blob.core.windows.net";
    string accountName = "???";
    string accountKey = "???";

        while(retry)
        {
            FileStream stream = new FileStream("C:\\temp\\mydownload.jpg", FileMode.Append);

            try
            {
                CloudBlobClient blobClient =
                new CloudBlobClient(new Uri(blobEndpoint), new StorageCredentialsAccountAndKey(accountName, accountKey));

                CloudBlob blob = blobClient.GetBlobReference("documents/drive.png");

                blob.DownloadToStream(stream);

                retry = false;
            }
            catch (Exception ee)
            {
                if (MessageBox.Show(ee.Message.ToString(), "ARGH!", MessageBoxButtons.RetryCancel) != System.Windows.Forms.DialogResult.Retry)
                    retry = false;
            }
            finally
            {
                stream.Flush();
                stream.Close();
            }

        }

The exception being generated is :

    Microsoft.WindowsAzure.StorageClient.StorageClientException was unhandled
  Message=Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
  Source=Microsoft.WindowsAzure.StorageClient
  StackTrace:
       at Microsoft.WindowsAzure.StorageClient.Tasks.Task`1.get_Result()
       at Microsoft.WindowsAzure.StorageClient.Tasks.Task`1.Execute()
       at Microsoft.WindowsAzure.StorageClient.RequestWithRetry.RequestWithRetrySyncImpl[TResult](ShouldRetry retryOracle, SynchronousTask`1 syncTask)
       at Microsoft.WindowsAzure.StorageClient.TaskImplHelper.ExecuteSyncTaskWithRetry[TResult](SynchronousTask`1 syncTask, RetryPolicy policy)
       at Microsoft.WindowsAzure.StorageClient.CloudBlob.DownloadToStream(Stream target, BlobRequestOptions options)
       at Microsoft.WindowsAzure.StorageClient.CloudBlob.DownloadToStream(Stream target)
       at TestAzure.Form1.button1_Click(Object sender, EventArgs e) in c:\users\richard.donaldson\documents\visual studio 2010\Projects\TestAzure\TestAzure\Form1.cs:line 41
       at System.Windows.Forms.Control.OnClick(EventArgs e)
       at System.Windows.Forms.Button.OnClick(EventArgs e)
       at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.ButtonBase.WndProc(Message& m)
       at System.Windows.Forms.Button.WndProc(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.Run(Form mainForm)
       at TestAzure.Program.Main() in c:\users\richard.donaldson\documents\visual studio 2010\Projects\TestAzure\TestAzure\Program.cs:line 18
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: System.Net.WebException
       Message=The remote server returned an error: (403) Forbidden.
       Source=System
       StackTrace:
            at System.Net.HttpWebRequest.GetResponse()
            at Microsoft.WindowsAzure.StorageClient.EventHelper.ProcessWebResponseSync(WebRequest req, EventHandler`1 handler, Object sender)
       InnerException: {"The remote server returned an error: (403) Forbidden."}

Upvotes: 3

Views: 4557

Answers (2)

user1141368
user1141368

Reputation: 51

Hahahaha. Gah. I've just changed it to HTTPS and now it works fine. I should probably use SSL anyway so no worries really, but it should work with the HTTP end point non the less

Upvotes: 2

Ben Lobaugh
Ben Lobaugh

Reputation: 374

I have run across this issue when using the Windows Azure SDK for PHP as well. Did you notice any strange behavior with your app at the time? I.E. slow response, major network latency, etc

Added: also were you creating multiple connections quickly, like in a loop?

Upvotes: 0

Related Questions