Поместите файл MSI в хранилище Azure с помощью URL-адреса SAS - PullRequest
0 голосов
/ 31 мая 2018

Я загружаю файл MSI для MS Intune в хранилище Azure.Я разбиваю файл на куски и загружаю их в репозиторий по ссылке SAS.Когда я загружаю файл, я получаю успешный ответ.Intune подтверждает, что файл был успешно загружен.

enter image description here

Но когда компьютер синхронизируется с Intune, файл не устанавливается.Intune сообщает, что при установке файла произошла ошибка (код или причина не указана).

Мне кажется, что проблема заключается в разбиении файла на блоки.Но все мои попытки решить эту проблему потерпели неудачу.

public async Task UploadFile(string fullFilePath, string blobSasUri, int timeout = 60)
{

    var BlockSize = 1024 * 1024; 
    var blocks = new List<String>();

    using (var fileStream = new FileStream(fullFilePath, FileMode.Open, FileAccess.Read))
    {
        var buffer = new byte[BlockSize];

        var bytesRead = 0;
        var blockNumber = 0;
        while ((bytesRead = fileStream.Read(buffer, 0, BlockSize)) > 0)
        {
            var actualBytesRead = new byte[bytesRead];

            Buffer.BlockCopy(buffer, 0, actualBytesRead, 0, bytesRead);
            var chunk = blockNumber++;
            var blockId = Convert.ToBase64String(Encoding.UTF8.GetBytes(chunk.ToString("0000")));
            blocks.Add(blockId);

            await UploadBlock(blobSasUri, blockId, actualBytesRead, timeout);
        }
    }

    await CommitAllBlocks(blobSasUri, blocks,  timeout);

}

private async Task UploadBlock(String sasUrl, String blockId, byte[] contentBytes, int timeout)
{
    using (var client = GetHttpClient(timeout))
    {
        var blockUrl = String.Format("{0}&comp=block&blockid={1}", sasUrl, blockId);

        var iso = Encoding.GetEncoding("ISO-8859-1");
        var encodedBody = iso.GetString(contentBytes);

        HttpContent content = new StringContent(encodedBody, iso );

        client.DefaultRequestHeaders.Add("x-ms-blob-type", "BlockBlob");

        var result = await client.PutAsync(blockUrl, content);

    }
}

private HttpClient GetHttpClient(int timeout)
{
    var client = new HttpClient();
    client.Timeout = GetTimeout(timeout);

    return client;
}

private TimeSpan GetTimeout(int specifiedTimeout)
{
    if (specifiedTimeout == 0)
    {
        return TimeSpan.FromMilliseconds(Timeout.Infinite);
    }

    return TimeSpan.FromMinutes(specifiedTimeout);
}

private async Task CommitAllBlocks(string sasUrl, List<string> blockIds,  int timeout)
{
    using (var client = GetHttpClient(timeout))
    {
        var contentString = @"<?xml version=""1.0"" encoding=""utf-8""?><BlockList>";

        foreach (var blockId in blockIds)
        {
            contentString += $"<Latest>{blockId}</Latest>";
        }
        contentString += "</BlockList>";


        HttpContent content = new StringContent(contentString);

        var commitUrl = $"{sasUrl}&comp=blocklist";

        await client.PutAsync(commitUrl, content);
    }
}

В качестве примера я использую пример от Microsoft.Я проверил его производительность, и он работает хорошо.Файл установлен на компьютер.https://github.com/microsoftgraph/powershell-intune-samples/blob/master/LOB_Application/Application_LOB_Add.ps1

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