3

Привет всем Я хочу получить доступ к элементам azure tables из окна телефона либо с использованием API для отдыха, либо с использованием Odata. Я написал код, но это дало мне NULL-ответ. Каждый раз, когда я хочу получить доступ к элементу таблицы, я вызываю функцию GetEntity. Ниже приведен код, который я использую. Пожалуйста, если кто-нибудь знает, что не так в этом коде или какая-либо помощь, ответьте как можно скорее.Доступ к объектам azure tables

//////////// 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

ya производства редактирование извините за неудобство. –

ответ

1

Я проверил ваш код и нашел функцию GetEntity() имеет некоторые проблемы в отношении создания подписи для доступа к Windows Azure Table Storage, так что я взломать вместе следующий код, который делает работу. Вы можете просто заменить 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(); 
} 

Чтобы устранить проблему, связанных с Signature, я взял код из Storage_REST_CS sample который имеет превосходную реализацию доступа к Windows Azure (BLOB, Таблица & очереди) хранения через интерфейс REST.

+1

Привет, я разрабатываю это приложение на телефоне Windows. Поэтому некоторые библиотеки и методы не поддерживаются. Например: a) Тип или имя пространства имен NameValueCollection не удалось найти. b) HttpWebRequest Не содержит определения «Длина контента» c) «System.Net.HttpUtility» не содержит определения для «ParseQueryString» d) «System.Collections.ArrayList» не содержит определения для «Сортировка» e) Система .Collections.ArrayList 'не содержит конструктор, который принимает 1 аргумент –

+1

и еще один: System.Collections.ArrayList' недоступен из-за уровня защиты –

+1

, мы можем использовать List вместо ArrayList. –

Смежные вопросы