Я загружаю файл MSI для MS Intune в хранилище Azure.Я разбиваю файл на куски и загружаю их в репозиторий по ссылке SAS.Когда я загружаю файл, я получаю успешный ответ.Intune подтверждает, что файл был успешно загружен.
![enter image description here](https://i.stack.imgur.com/9inac.png)
Но когда компьютер синхронизируется с 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