Question

I followed these steps in the hopes of getting storage emulator on localhost working.

I am using Windows 8 RTM.

  1. Downloaded Eclipse and copied it to Program Files.
  2. Installed Java JDK 7.
  3. Installed Azure SDK.
  4. Installed Azure plugin for Eclipse.
  5. Launched storage emulator from the "Start" screen.
  6. Created a Java project.
  7. Added External jars in the build path for Azure to this project.
  8. Wrote this simple sample code:

    import com.microsoft.windowsazure.services.blob.client.CloudBlobClient;
    import com.microsoft.windowsazure.services.blob.client.CloudBlobContainer;
    import com.microsoft.windowsazure.services.core.storage.CloudStorageAccount;
    
    public class AzureStore {
        public static final String storageConnectionString = "DefaultEndpointsProtocol=http;"
                + "UseDevelopmentStorage=true;"
                + "AccountName=devstoreaccount1;"
                + "BlobEndpoint=http://127.0.0.1:10000;"
                + "AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==";
    
        public static void main(String[] args) throws Exception {
            // Retrieve storage account from connection-string
            CloudStorageAccount storageAccount = CloudStorageAccount
                    .parse(storageConnectionString);
    
            // Create the blob client
            CloudBlobClient blobClient = storageAccount.createCloudBlobClient();
            // Get a reference to a container
            // The container name must be lower case
            CloudBlobContainer container = blobClient
                    .getContainerReference("tweet");
    
            try {
                // Create the container if it does not exist
                System.out.println(container.createIfNotExist());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

It gives the following exception:

com.microsoft.windowsazure.services.core.storage.StorageException: The value for one of the HTTP headers is not in the correct format.
at com.microsoft.windowsazure.services.core.storage.StorageException.translateException(StorageException.java:104)
at com.microsoft.windowsazure.services.blob.client.CloudBlobContainer$2.execute(CloudBlobContainer.java:334)
at com.microsoft.windowsazure.services.blob.client.CloudBlobContainer$2.execute(CloudBlobContainer.java:291)
at com.microsoft.windowsazure.services.core.storage.utils.implementation.ExecutionEngine.executeWithRetry(ExecutionEngine.java:110)
at com.microsoft.windowsazure.services.blob.client.CloudBlobContainer.createIfNotExist(CloudBlobContainer.java:339)
at com.microsoft.windowsazure.services.blob.client.CloudBlobContainer.createIfNotExist(CloudBlobContainer.java:257)
at AzureStore.main(AzureStore.java:26)

I am confused at this point, as what might be wrong. Can someone help me?

Was it helpful?

Solution

I think the error is happening because of incorrect storage service version in the API. In your code you're trying to create a blob container in development storage. The "x-ms-version" request header value is sent as "2012-02-12" which though is the latest one but still not supported by the development storage. Development storage still supports "2011-08-18".

If you try your code against cloud storage, you should be able to create that blob container.

If you're only doing your development against development storage, one thing you could do is download the source code from GitHub (https://github.com/WindowsAzure/azure-sdk-for-java/downloads) and modify the following line of code in Constants.java

public static final String TARGET_STORAGE_VERSION = "2012-02-12";

to

public static final String TARGET_STORAGE_VERSION = "2011-08-18";

and compile the source code again. This may break some new functionality introduced in the latest service release (like asynchronous copy blobs etc.)

Other alternative is to wait out for the new SDK to come out and hope that the emulator in that version support the latest storage service version.

OTHER TIPS

More about URI class

See if below works for you.

URI BlobEndPoint = new URI("http://127.0.0.1:10000/devstoreaccount1");

CloudBlobClient bClient = new CloudBlobClient(BlobEndPoint, new StorageCredentialsAccountAndKey(AccountName,
                AccountSecurityKey));
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top