Почему моя функция времени Azure V2 аварийно завершает работу со ссылкой newtonsoft? - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть простая функция Azure на основе таймера, которая вылетает со следующим сообщением

Я добавил пакет nuget для newtonsoft.Json, так что я не уверен, почему это проблема.

[1/11/2018 07:00:26] Executed 'PimDataFeeder' (Failed, Id=291e9147-7f57-4fd3-887d-a8001afc8230)
[1/11/2018 07:00:26] System.Private.CoreLib: Exception while executing function: PimDataFeeder. System.Private.CoreLib: Could not load file or assembly 'Newtonsoft.Json, Version=11.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'. Could not find or load a specific file. (Exception from HRESULT: 0x80131621). System.Private.CoreLib: Could not load file or assembly 'Newtonsoft.Json, Version=11.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'.

---- РЕДАКТИРОВАТЬ ----

Простая функция выглядит следующим образом: в основном она загружает файл из удаленного места назначения и манипулирует им в памяти перед записью его в экземпляр CosmosDB, или, по крайней мере, это идея, когда он начинает работать. Помещение точки останова в цикл говорит мне о том, что первая итерация цикла работает, и действительно, первая строка строки корректно разделяется, а затем следует сбой

using System;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using System.Net.Http;
using System.Net.Http.Handlers;
using System.Net.Http.Headers;
using System.IO.Compression;
using System.IO;
using System.Text;
using System.Net;
using Microsoft.Azure.Documents;
using Microsoft.Azure.Documents.Client;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using System.ComponentModel.DataAnnotations;

namespace NWCloudPimDataFeeder
{
    public static class PimDataFeeder
    {
        [FunctionName("PimDataFeeder")]
        public static async System.Threading.Tasks.Task RunAsync([TimerTrigger("0 */15 * * * *")]TimerInfo myTimer, TraceWriter log)
        {
            // The endpoint to your cosmosdb instance
            var endpointUrl = "https://example.com";
            // The key to you cosmosdb
            var key = "XXX";
            // The name of the database
            var databaseName = "XXX";
            // The name of the collection of json documents
            var databaseCollection = "XXX";

            log.Info($"C# Timer trigger function executed at: {DateTime.Now}");

            HttpClientHandler handler = new HttpClientHandler()
            {
                AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
            };

            HttpClient client = new HttpClient();

            client.DefaultRequestHeaders.Add("Authorization", "Bearer XXX");

            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            HttpResponseMessage file = await client.GetAsync("https://example.com");
            var content = await file.Content.ReadAsByteArrayAsync();

            MemoryStream originalFileStream = new MemoryStream(content);
            using (GZipStream decompressionStream = new GZipStream(originalFileStream, CompressionMode.Decompress))
            {
                MemoryStream decompressedFileStream = new MemoryStream();
                decompressionStream.CopyTo(decompressedFileStream);
                byte[] fileResult = new byte[decompressedFileStream.Length];
                decompressedFileStream.Position = 0;
                decompressedFileStream.Read(fileResult, 0, fileResult.Length);
                string result = System.Text.Encoding.UTF8.GetString(fileResult);
                //log.Info(result);

                foreach (var singleItem in result.Split(new string[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries))
                {
                    log.Info("singleItem looks like: " +singleItem);
                    log.Info("In the loop");
                    var itemWrapper = new ItemWrapper { NWID = Guid.NewGuid(), Item = singleItem, DocumentType = "Item"};

                    // Create a cosmosdb client
                    using (var docClient = new DocumentClient(new Uri(endpointUrl), key))
                    {
                        // Save the document to cosmosdb
                        docClient.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(databaseName, databaseCollection), itemWrapper)
                            .GetAwaiter().GetResult();
                    }
                }
            }
        }
    }

    public class ItemWrapper
    {
        public Guid NWID { get; set; }
        [Required]
        [JsonProperty("item")]
        public string Item { get; set; }
        [Required]
        [JsonProperty("documentType")]
        public string DocumentType { get; set; }
    }
}

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Прямо сейчас Cli и Runtime выводятся, как показано ниже, когда мы отлаживаем функцию в VS. И проект функции создается с помощью Microsoft.NET.Sdk.Functions 1.0.23 (> = 1.0.14), по умолчанию ссылающейся на Newtonsoft.Json 11.0.2.

Azure Functions Core Tools (2.1.748 Commit hash: 5db20665cf0c11bedaffc96d81c9baef7456acb3)
Function Runtime Version: 2.0.12134.0

Я могу воспроизвести проблему только с некоторыми старыми функциями времени выполнения, для которых по-прежнему требуется v10 Newtonsoft.Json. Так что проверьте версию времени выполнения функции и убедитесь, что VS использует последнюю версию.

Скачать и установить cli вручную

  1. Удалить старую функцию CLI, используемую VS. Удалить вложенные папки в %localappdata%\AzureFunctionsTools\Releases.
  2. Удалить шаблонный движок, использованный VS %userprofile%\.templateengine.
  3. Перейдите в CLI-фид, чтобы загрузить последнюю версию cli, прямо сейчас это фид 2.10.1 и CLI 2.1.748 .
  4. Перейдите на %localappdata%\AzureFunctionsTools\Releases и создайте папку 2.10.1.
  5. Распакуйте zip и переименуйте его в cli, перетащите его под 2.10.1.
  6. Скопируйте папку templates в cli в 2.10.1 и переименуйте два файла внутри, удалив версию. например, itemTemplates.2.0.0-10300.nupkg до itemTemplates.nupkg.
  7. Создайте файл manifest.json в 2.10.1, как показано ниже, и измените имя пользователя.

        {
          "CliEntrypointPath": "C:\\Users\\UserName\\AppData\\Local\\AzureFunctionsTools\\Releases\\2.10.1\\cli\\func.exe",
          "FunctionsExtensionVersion": "~2",
          "MinimumRuntimeVersion": "2.1",
          "ReleaseName": "2.10.1",
          "RequiredRuntime": ".NET Core",
          "SdkPackageVersion": "1.0.23",
          "TemplatesDirectory": "C:\\Users\\UserName\\AppData\\Local\\AzureFunctionsTools\\Releases\\2.10.1\\templates"
        }
    

Структура папок должна быть такой

enter image description here

После перезапуска VS все должно работать как положено.

0 голосов
/ 01 ноября 2018

Эти ошибки часто бывают вызваны отсутствием установленной последней версии Functions SDK / Tools. Ссылка на Newtonsoft 11.0.0 предполагает, что это может быть так (последняя версия 11.0.2). Вы можете перейти в Инструменты -> Расширения и обновления -> Обновления (в нижнем левом углу окна) в VS, чтобы проверить наличие обновлений для инструмента Функции Azure. Получив последнее обновление, попробуйте заново создать функцию, чтобы увидеть, работает ли она.

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