Azure SDK for Java -抛出InvalidKeyException的示例程序



使用Azure存储SDK for Java,我试图执行基本的创建,读取,更新,删除Azure表存储操作,如下面的链接所示:https://azure.microsoft.com/en-us/documentation/articles/storage-java-how-to-use-table-storage/

创建表的示例程序:

package com.azure.test;
import java.io.UnsupportedEncodingException;
import com.microsoft.azure.storage.*;
import com.microsoft.azure.storage.table.CloudTable;
import com.microsoft.azure.storage.table.CloudTableClient;
import com.microsoft.windowsazure.core.utils.Base64;
public class App 
{
    public static void main( String[] args ) throws StorageException,    UnsupportedEncodingException
{
    String storageConnectionString =
            "DefaultEndpointsProtocol=http;" +
            "AccountName=accountname;" + 
            "AccountKey=storagekey;"+
           "EndpointSuffix=table.core.windows.net"; 
    try
    {
        // Retrieve storage account from connection-string.
        CloudStorageAccount storageAccount =
           CloudStorageAccount.parse(storageConnectionString);
        CloudTableClient tableClient =               storageAccount.createCloudTableClient();
      //Create the table if it doesn't exist.
       String tableName = "MyTable";
       CloudTable cloudTable = tableClient.getTableReference(tableName);
       cloudTable.createIfNotExists();               
    }
    catch (Exception e)
    {
        // Output the stack trace.
        e.printStackTrace();
        System.out.println(e.getMessage());
        }
    }
}

这段代码似乎相当容易理解。它将连接到Azure表存储,如果具有给定名称的表不存在,它将创建它。但我得到一个InvalidKeyException(完整的异常粘贴在下面)。

java.security。InvalidKeyException:存储密钥不是一个有效的base64编码字符串。
com.microsoft.azure.storage.StorageCredentials.tryParseCredentials (StorageCredentials.java: 68)
com.microsoft.azure.storage.CloudStorageAccount.tryConfigureServiceAccount (CloudStorageAccount.java: 408)
com.microsoft.azure.storage.CloudStorageAccount.parse (CloudStorageAccount.java: 259)
com.azure.test.App.main (App.java: 71)

我很惊讶没有多少使用Azure存储的人面临这个问题。我尝试使用编码存储密钥,并在连接字符串中使用编码密钥,但仍然没有用。

String encodedKey=Base64.encode(storageKey.getBytes())
String storageConnectionString =
            "DefaultEndpointsProtocol=http;" +
            "AccountName=accountname" + 
            "AccountKey="+encodedKey+
           "EndpointSuffix=table.core.windows.net;"; 
有谁能帮我一下吗?我在谷歌搜索了很多,我能找到一个用户提出了一个类似的问题在讨论,但没有提供答案,或者更确切地说,答案是没有帮助。

Update:/问题的解决方案

首先,我确保连接字符串中的所有属性都用';'分隔,正如Gaurav(下文)所建议的

原来我必须在程序中手动设置代理设置,因为我公司的工作机器使用代理连接到互联网。

System.getProperties().put("http.proxyHost", "myproxyHost");
System.getProperties().put("http.proxyPort", "myProxyPort");
System.getProperties().put("http.proxyUser", "myProxyUser");
System.getProperties().put("http.proxyPassword","myProxyPassword");

更新代理设置为我解决了这个问题

请更改以下代码行:

String storageConnectionString =
            "DefaultEndpointsProtocol=http;" +
            "AccountName=accountname" + 
            "AccountKey="+encodedKey+
           "EndpointSuffix=table.core.windows.net;"; 

String storageConnectionString =
            "DefaultEndpointsProtocol=http;" +
            "AccountName=accountname" + 
            ";AccountKey="+encodedKey+
           ";EndpointSuffix=core.windows.net;"; 

基本上在您的代码中,在AccountName, AccountKeyEndpointSuffix之间没有分隔符(;)。此外,如果您连接到标准端点(core.windows.net),则不需要在连接字符串中指定EndpointSuffix

最后,请确保帐号密钥是正确的

相关内容

  • 没有找到相关文章

最新更新