3

大家好,我想從Windows Phone使用rest API或使用Odata訪問天藍色的表實體。 我已經寫了一個代碼,但這給了我NULL響應。每次我想訪問一個表格實體時,我都會調用GetEntity函數。以下是我正在使用的代碼。 如果有人知道這段代碼或任何幫助答覆asap有什麼問題,請如此。訪問天藍色表實體

//////////// GetEntity Function.//////////

 private void GetEntity(String tableName, String partitionKey, String rowKey) 
    { 
     String requestMethod = "GET"; 

     String urlPath = String.Format("{0}(PartitionKey='{1}',RowKey='{2}')", tableName, partitionKey, rowKey); 


     String dateInRfc1123Format = DateTime.Now.ToString("R", System.Globalization.CultureInfo.InvariantCulture); 

     String canonicalizedResource = String.Format("/{0}/{1}", AzureStorageConstants.Account, urlPath); 
     String stringToSign = String.Format(
       "{0}\n\n\n{1}\n{2}", 
       requestMethod, 
       dateInRfc1123Format, 
       canonicalizedResource); 
     String authorizationHeader = CreateAuthorizationHeader(stringToSign); 
     HttpWebResponse response; 
     Uri uri = new Uri(AzureStorageConstants.TableEndPoint + urlPath); 


     HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri); 
     request = (HttpWebRequest)WebRequest.Create(uri); 
     request.Method = requestMethod; 
     request.Headers[HttpRequestHeader.ProxyAuthorization] = null; 
     request.Headers["Address"] = uri.ToString(); 
     request.Headers["Method"] = requestMethod; 
     request.Headers["x-ms-date"]= DateTime.Now.ToString("R", System.Globalization.CultureInfo.InvariantCulture); 
     request.Headers["x-ms-version"]= "2011-08-18";    
     request.Headers["Authorization"] = authorizationHeader; 
     request.Headers["Accept-Charset"] = "UTF-8"; 
     request.Headers["ContentType"] = "application/atom+xml,application/xml"; 
     request.ContentType = "application/atom+xml,application/xml"; 
     request.Headers["DataServiceVersion"] = "1.0;NetFx"; 
     request.Headers["MaxDataServiceVersion"] = "1.0;NetFx"; 

     using (response = GetResponse(request)) 
     { 
      Stream dataStream = response.GetResponseStream(); 
      using (StreamReader reader = new StreamReader(dataStream)) 
      { 
       String responseFromServer = reader.ReadToEnd(); 
      } 
     } 
    } 

//的GetResponse功能。

 public HttpWebResponse GetResponse(HttpWebRequest request) 
     { 
     var dataReady = new AutoResetEvent(false); 
     HttpWebResponse response = null; 
     var callback = new AsyncCallback(delegate(IAsyncResult asynchronousResult) 
     { 
      response = (HttpWebResponse)request.EndGetResponse(asynchronousResult); 
      dataReady.Set(); 
     }); 

     request.BeginGetResponse(callback, request); 
      return response; 
    } 

////// CreateAuthorization Function.///

 private String CreateAuthorizationHeader(String canonicalizedString) 
    { 
    String signature = string.Empty; 
using (HMACSHA256 hmacSha256 = new HMACSHA256(Convert.FromBase64String(AzureStorageConstants.Key))) 

{ 
    Byte[] dataToHmac = System.Text.Encoding.UTF8.GetBytes(canonicalizedString); 
    signature = Convert.ToBase64String(hmacSha256.ComputeHash(dataToHmac)); 
} 

String authorizationHeader = String.Format(
     CultureInfo.InvariantCulture, 
     "{0} {1}:{2}", 
     AzureStorageConstants.SharedKeyAuthorizationScheme, 
     AzureStorageConstants.Account, 
     signature); 

return authorizationHeader; 

}

//////// AzureStorageConstants。

 public static class AzureStorageConstants 
    { 


    private static String TableAccount = "datablobs"; 
    private static String cloudEndPointFormat = "http://" + TableAccount + ".table.core.windows.net/"; 


    private static String cloudKey = "Primary Access Key";// Here actual key is written. 
    private static string AzureStorage_SharedKeyAuthorizationScheme = "SharedKey"; 


     public static String Account 
     { 
      get { return TableAccount; } 
     } 

     public static string SharedKeyAuthorizationScheme 
     { 
      get { return AzureStorage_SharedKeyAuthorizationScheme; } 
     } 

     public static string Key 
     { 
      get { return cloudKey; } 
     } 

     public static String TableEndPoint 
     { 
      get { return cloudEndPointFormat; } 
     } 
    } 
+0

如何嘗試編輯代碼的可讀性?我試圖爲你做一次,但顯然你不喜歡它,並將其回滾。 – ctacke

+1

你完成編輯抱歉造成不便。 –

回答

1

我檢查你的代碼,發現GetEntity()函數確實有一些問題是關於創建簽名訪問在Windows Azure表存儲,所以我一起砍下面的代碼,不工作。您可以替換您的GetEntity()並將下面代碼中包含的其他兩個函數添加到工作簽名過程中。

private string GetEntity(String tableName, String partitionKey, String rowKey) 
{ 
    string result = ""; 
    String requestMethod = "GET"; 
    String urlPath = String.Format("{0}(PartitionKey='{1}',RowKey='{2}')",tableName, partitionKey, rowKey); 
    DateTime now = DateTime.UtcNow; 
    HttpWebResponse response; 
    string uri = AzureStorageConstants.TableEndPoint + urlPath; 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri); 
    request.Method = requestMethod; 
    request.ContentLength = 0; 
    request.Headers.Add("x-ms-date", now.ToString("R", System.Globalization.CultureInfo.InvariantCulture)); 
    request.Headers.Add("x-ms-version", "2009-09-19"); 
    request.ContentType = "application/atom+xml"; 
    request.Headers.Add("DataServiceVersion", "1.0;NetFx"); 
    request.Headers.Add("MaxDataServiceVersion", "1.0;NetFx"); 
    request.Headers.Add("If-Match", "*"); 
    request.Headers.Add("Accept-Charset", "UTF-8"); 
    request.Headers.Add("Authorization", AuthorizationHeader(requestMethod, now, request)); 
    request.Accept = "application/atom+xml"; 
    using (response = request.GetResponse() as HttpWebResponse) 
    { 
     Stream dataStream = response.GetResponseStream(); 
     using (StreamReader reader = new StreamReader(dataStream)) 
     { 
      result = reader.ReadToEnd(); 
     } 
    } 
    return result; 
} 

public string AuthorizationHeader(string method, DateTime now, HttpWebRequest request) 
{ 
    string MessageSignature; 
    MessageSignature = String.Format("{0}\n\n{1}\n{2}\n{3}", 
     method, 
     "application/atom+xml", 
     now.ToString("R", System.Globalization.CultureInfo.InvariantCulture), 
     GetCanonicalizedResource(request.RequestUri, AzureStorageConstants.Account) 
     ); 
    byte[] SignatureBytes = System.Text.Encoding.UTF8.GetBytes(MessageSignature); 
    System.Security.Cryptography.HMACSHA256 SHA256 = new System.Security.Cryptography.HMACSHA256(Convert.FromBase64String(AzureStorageConstants.Key)); 
    String AuthorizationHeader = "SharedKey " + AzureStorageConstants.Account + ":" + Convert.ToBase64String(SHA256.ComputeHash(SignatureBytes)); 
    return AuthorizationHeader; 
} 

public string GetCanonicalizedResource(Uri address, string accountName) 
{ 
    StringBuilder str = new StringBuilder(); 
    StringBuilder builder = new StringBuilder("/"); 
    builder.Append(accountName); 
    builder.Append(address.AbsolutePath); 
    str.Append(builder.ToString()); 
    NameValueCollection values2 = new NameValueCollection(); 
    NameValueCollection values = HttpUtility.ParseQueryString(address.Query); 
    foreach (string str2 in values.Keys) 
    { 
     ArrayList list = new ArrayList(values.GetValues(str2)); 
     list.Sort(); 
     StringBuilder builder2 = new StringBuilder(); 
     foreach (object obj2 in list) 
     { 
      if (builder2.Length > 0) 
      { 
       builder2.Append(","); 
      } 
      builder2.Append(obj2.ToString()); 
     } 
     values2.Add((str2 == null) ? str2 : str2.ToLowerInvariant(), builder2.ToString()); 
    } 
    ArrayList list2 = new ArrayList(values2.AllKeys); 
    list2.Sort(); 
    foreach (string str3 in list2) 
    { 
     StringBuilder builder3 = new StringBuilder(string.Empty); 
     builder3.Append(str3); 
     builder3.Append(":"); 
     builder3.Append(values2[str3]); 
     str.Append("\n"); 
     str.Append(builder3.ToString()); 
    } 
    return str.ToString(); 
} 

要修復您的簽名相關的問題,我把代碼Storage_REST_CS sample它擁有精湛的實現通過REST接口訪問的Windows Azure(BLOB,表&隊列)的存儲空間。

+1

嗨,我正在開發這個應用程序在Windows手機上。所以一些庫和方法不受支持。像a)無法找到類型或名稱空間名稱「NameValueCollection」。 b)HttpWebRequest不包含「內容長度」的定義c)'System.Net.HttpUtility'不包含'ParseQueryString'的定義d)'System.Collections.ArrayList'不包含'Sort'的定義e)系統.Collections.ArrayList'不包含構造函數,它接受1個參數 –

+1

和另外一個:System.Collections.ArrayList'由於其保護級別 –

+1

而不可訪問我們可以使用List而不是ArrayList。 –