Прекомпилированный вывод функции Azure в хранилище BLOB-объектов, получающий 500 Внутренняя ошибка сервера - PullRequest
0 голосов
/ 15 января 2019

Окончательный вывод моей предварительно скомпилированной функции Azure на C # - запись в хранилище больших двоичных объектов в виде файла JSON. Я неправильно пишу в хранилище BLOB-объектов? Я ударил точки останова, установленные в фигурных скобках в конце функции, и похоже, что она выходит из функции. Примерно через 20 секунд я получаю исключение:

Исключительная ситуация при выполнении функции: ServiceBusTriggeredProcessAccepted. Microsoft.Azure.WebJobs.Host: ошибка при обработке параметра outboundStringForBlobStorage после возврата функции :. Microsoft.WindowsAzure.Storage: удаленный сервер возвратил ошибку: (500) Внутренняя ошибка сервера.

Функция Azure является событием, вызванным служебной шиной. После сбоя обработки автопостановка элемента в очереди служебной шины выполняется автоматически и повторяется до 10 раз, прежде чем он перемещается в очередь недоставленных сообщений. Следует отметить, что объекты достаточно велики по размеру, поэтому обычные очереди слишком малы для них.

public class SomeObject
{
    //15 Properties all string and boolean
    public string Attachment{ get; set;}
    public string AnotherProperty{ get; set;}
    public bool IsConditionMet { get; set; }
    //Maybe these aren't needed now since it's blob storage but it's part of the object currently
    public string PartitionKey { get; set; }
    public string RowKey { get; set; }
}

[FunctionName("ServiceBusTriggeredProcessAccepted")]
public static void Run([ServiceBusTrigger("accepted")]
 SomeObject someObject,
 TraceWriter log,
 [Blob("accepted-attachments/{Attachment}", FileAccess.Read)] Byte[] blobContent
 , [Blob("accepted-sent/{rand-guid}.json")] out string outboundStringForBlobStorage 
 )
{
    someObject.PartitionKey = "email";
    someObject.RowKey = Guid.NewGuid().ToString();
    //Business Logic to execute here
    SomeService.SomeFunctionToSendBlobFile(someObject, blobContent)   
    outboundStringForBlobStorage  = JsonConvert.SerializeObject(someObject);
}

Я использую: Пакет SDK NuGet для функций Azure 1.0.21
Microsoft.Azure.Webjobs 2.2.0
WindowsAzure.ServiceBus 5.0.0
DotNetFramework 4.6.1
Эмулятор хранилища Windows Azure 5.8.0.0
Runtime Version = 1.0.11702.0

Сериализация должна быть как-то продезинфицирована? В прошлом мне не приходилось проводить санитарную обработку, но данные в этом объекте изменились, и именно тогда начались проблемы. Я ожидаю, что файл будет немедленно записан в хранилище BLOB-объектов или немедленно выдаст исключение, а не через 20 секунд после выхода из функции.

1 Ответ

0 голосов
/ 16 января 2019

Ошибка может не иметь никакого отношения к сериализации, давайте сосредоточимся на этой строке.

Microsoft.WindowsAzure.Storage: удаленный сервер возвратил ошибку: (500) Внутренняя ошибка сервера.

Если я правильно понимаю, вход и выход большого двоичного объекта соединяются с эмулятором хранилища Azure. Что-то не так в эмуляторе v5.8 при сбое записи BLOB-объекта Установите последнюю версию эмулятора (v5.9 прямо сейчас), чтобы избавиться от проблемы.

И также обратите внимание, что Runtime Version=1.0.11702.0 означает, что CLI и шаблоны устарели, чтобы потреблять последнюю версию, заставляет VS загружать при запуске .

  1. Убедитесь, что Azure Functions and Web Jobs Tools - это последний , сейчас это 15.10.2046. В меню VS> Инструменты> Расширения и обновления> Обновления обновите расширение, если оно есть в списке.

  2. Удалить папку %localappdata%\AzureFunctionsTools и %userprofile%\.templateengine.

  3. Повторно открыть VS, чтобы создать новый проект Function, подождите в диалоговом окне создания, см. Making sure all templates are up to date....

    enter image description here Через некоторое время мы видим изменения чаевых как

    enter image description here

  4. Нажмите Обновить, чтобы мгновенно работать с последним шаблоном.

Не забудьте обновить Microsoft.NET.Sdk.Functions до последней версии (1.0.24 прямо сейчас). И нам не нужно устанавливать Microsoft.Azure.Webjobs отдельно, на который ссылается Microsoft.NET.Sdk.Functions внутри.

После запуска функции мы можем видеть время выполнения Version=1.0.12205.0 прямо сейчас.

...