Azure BlobStorage перезапускает ETag всегда null. Почему? (xamarin или любой проект c #, использующий хранилище BLOB-объектов) - PullRequest
0 голосов
/ 31 марта 2019

Я новичок в Azure / хранилище BLOB-объектов и т. Д.
Мне нужно прочитать файл из BLOB-объекта, используя остальные API. Я хочу использовать eTag для локального кэширования, а затем только для чтения файла если этаг изменился.

Если Etag не является правильным способом проверить, изменились ли данные, то, пожалуйста, сообщите?

То, что я заметил, что я могу читать файл, но eTag все время равен нулю.

Что я делаю не так?

private const    string EtagKey     = "myEtag";
private readonly string xmlFilename 
= Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
"MyFile.xml");

//get etag from cache if there
public string CachedEtagVersion => Preferences.Get(EtagKey, string.Empty);

private async Task<string> GetFileFromCloud()
{
    using (var httpClient = new HttpClient())
    {
        if (!string.IsNullOrEmpty(CachedEtagVersion))
        {
            httpClient.DefaultRequestHeaders.Add("If-None-Match", CachedEtagVersion);
        }

        var response = await httpClient.GetAsync("https://mybloburl/XmlFiles/Myfile.xml");

        string xmlFileContent;
        if (response.StatusCode == HttpStatusCode.NotModified)
        {
            xmlFileContent = ReadFromCache();
        }
        else
        {
            xmlFileContent = await response.Content.ReadAsStringAsync();
        }

        //response.Headers.ETag always NULL WHY??????**
        UpdateLocalCache(response.Headers.ETag, xmlFileContent);
        return xmlFileContent;
    }
}

private void UpdateLocalCache(EntityTagHeaderValue eTag, string xmlFileContent)
{
    if (eTag == null || CachedEtagVersion == eTag.Tag) return;
    //cache the etag it on the device using xam essentials
    Preferences.Set(EtagKey, eTag.Tag);
    File.WriteAllText(xmlFilename, xmlFileContent);
}

private string ReadFromCache()
{
    if (!File.Exists(xmlFilename)) return string.Empty;
    return File.ReadAllText(xmlFilename);
}

1 Ответ

0 голосов
/ 31 марта 2019

Согласно этому

https://www.michaelcrump.net/azure-tips-and-tricks88/

Тег e предназначен для оптимистичного параллелизма, а не для последнего изменения файла.

Используйте метку времени для этого

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