404 при публикации в хранилище таблиц - PullRequest
2 голосов
/ 24 января 2012

Я пытаюсь записать данные в хранилище таблиц Azure, не используя классы TableContext и Table ServiceEntity, я просто хочу отправить необработанный XML (я хочу гибкость определения схемы на лету).

Когда я делаю это (и подписываю запрос, используя метод из SDK), я получаю 404. Не знаю почему.

Таблица существует. Я пропустил свои учетные данные, но они верны в моем исходном коде.

Приведенный ниже фрагмент кода иллюстрирует проблему.

Любые предложения приветствуются!

using System.IO;
using System.Net;
using System.Text;
using Microsoft.WindowsAzure.StorageClient.Protocol;

public static class Program
{
    public static void Main()
    {
        Credentials credentials = new Credentials("xxx", @"yyy");
        var uri = string.Format(@"http://{0}.table.core.windows.net/{1}(PartitionKey='{2}',RowKey='{3}')", credentials.AccountName, "TableName", "1", "1");
        var webRequest = (HttpWebRequest)WebRequest.Create(uri);
        webRequest.Method = "POST";
        webRequest.Headers.Add("DataServiceVersion", "2.0;NetFx");
        webRequest.Headers.Add("MaxDataServiceVersion", "2.0;NetFx");
        webRequest.ContentType = @"application/atom+xml";
        WriteToRequestStream(uri, webRequest);
        TableRequest.SignRequestForSharedKeyLite(webRequest, credentials);
        var response = webRequest.GetResponse(); // 404 thrown here
    }

    private static void WriteToRequestStream(string uri, HttpWebRequest webRequest)
    {
        var sb = new StringBuilder();
        sb.Append(@"<?xml version='1.0' encoding='utf-8' standalone='yes'?><entry xmlns:d='http://schemas.microsoft.com/ado/2007/08/dataservices' xmlns:m='http://schemas.microsoft.com/ado/2007/08/dataservices/metadata' xmlns='http://www.w3.org/2005/Atom'><title /><updated>2009-03-18T11:48:34.9840639-07:00</updated><author><name /></author><id>");
        sb.Append(uri);
        sb.Append(@"</id><content type='application/xml'><m:properties></m:properties></content></entry>");
        string body = sb.ToString();
        webRequest.ContentLength = body.Length;
        UTF8Encoding encoding = new UTF8Encoding();
        byte[] bytes = encoding.GetBytes(body);
        using (Stream requestStream = webRequest.GetRequestStream())
        {
            requestStream.Write(bytes, 0, bytes.Length);
        }
    }
}

Ответы [ 3 ]

1 голос
/ 15 декабря 2015

См. Ограничения типа для хранения таблицы на https://msdn.microsoft.com/en-us/library/azure/dd179338.aspx.Например, при публикации свойства с минимальным значением времени данных это приведет к 404

1 голос
/ 24 января 2012

При создании сущности у вас есть три варианта:

  1. Вставьте , в котором вы POST к http://myaccount.table.core.windows.net/mytable
  2. Вставить или объединить , в котором вы СЛИВЕТЕСЬ к http://myaccount.table.core.windows.net/mytable(PartitionKey="myPartitionKey", RowKey="myRowKey1")
  3. Вставьте или замените , в который вы положили http://myaccount.table.core.windows.net/mytable(PartitionKey="myPartitionKey", RowKey="myRowKey1")

Последние два, однако, не поддерживаются локальным эмулятором.

Кроме того, я посмотрел на запрос, который ваш код делает с помощью Fiddler, и в нем отсутствуют следующие заголовки:

  • Авторизация
  • Дата или x-ms-date
  • х-мс-версия

Чтобы правильно включить заголовки, попробуйте следующий код:

var webRequest = (HttpWebRequest)WebRequest.Create(uri);
webRequest.Method = "PUT";
webRequest.Headers.Add("DataServiceVersion", "2.0;NetFx");
webRequest.Headers.Add("MaxDataServiceVersion", "2.0;NetFx");
webRequest.Headers.Add("x-ms-version", "2011-08-18");
webRequest.ContentType = @"application/atom+xml";
TableRequest.SignRequestForSharedKeyLite(webRequest, credentials);
WriteToRequestStream(uri, webRequest);
var response = webRequest.GetResponse();

Обратите внимание, как я изменил метод для вставки или замены. Я также перевернул вызов на SignRequestForSharedKeyLite и добавил заголовок x-ms-version с версией 2011-08-18, иначе вставка или замена не поддерживаются.

0 голосов
/ 24 января 2012

Я думаю, вам не хватает заголовка 'x-ms-date'.Я считаю, что заголовок необходим (см. http://msdn.microsoft.com/en-us/library/windowsazure/dd179433.aspx).

. Возможно, стоит проверить http://azurestoragesamples.codeplex.com/ для получения полных примеров использования REST API. Большинство операций включены в него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...