Функция Azure - ServiceBusTrigger - Сообщение привязки исключения - PullRequest
0 голосов
/ 06 июня 2019

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

Exception while executing function: <functionName>. Microsoft.Azure.WebJobs.Host: Exception binding parameter 'message'. System.Private.CoreLib: Unable to translate bytes [9A] at index 60 from specified code page to Unicode.

В этом случае я не контролирую входящее сообщение (оно на самом деле отправляется из подписки DevOps Azure), поэтому мне нужно иметь возможность сделать функцию более гибкой, чтобы исключить это исключение.

Моя функция выглядит так:

[FunctionName("FunctionName")]
public static async Task Run(
    [ServiceBusTrigger("Queue", Connection = "ConnectionString")] byte[] message)

Я видел другой вопрос, который предлагает отойти от использования Message или BrokeredMessage объекта и использовать вместо него byte[] (и написать свою собственную кодировку для решения этой проблемы), но это не сработало для меня , Похоже, что среда выполнения все еще пытается что-то сделать с сообщением, прежде чем оно достигнет моей функции.

Как мне избежать этой проблемы?


Я оставлю этот вопрос открытым, потому что я еще не нашел, как решить эту проблему - однако теперь я видел, как исправить это в моем случае. Сообщения, которые я изо всех сил пытался обработать, - это сообщения, которые доставляются AzureDevOps ServiceHooks . Если я захожу в настройки (при создании или редактировании) сервисные хуки найдены здесь -> https: //.visualstudio.com//_settings/serviceHooks

Есть флажок, который я пропустил. Чтобы функция Azure могла обрабатывать сообщение, необходимо установить этот флажок. То есть Вы хотите отправить как не сериализованную строку. Это должно быть потому, что любой клиент находится между моей функцией и очередью и не может обрабатывать сериализованное сообщение .Net.

enter image description here

Tl; Dr -> Если у вас есть эта проблема, убедитесь, что выбрана эта опция выше

GitHub Issue Отслеживание проблемы

1 Ответ

2 голосов
/ 20 июня 2019

Проблема заключается в том, что библиотека функций просматривает тип сообщения вместо типа, указанного в функции, при принятии решения о том, декодировать его или нет. Поскольку Devops отправляет сообщение как тип application / json, библиотека пытается и не может декодировать его с помощью UTF8.

На данный момент выбор «отправить как несериализованную строку» является допустимым обходным решением. Эту проблему можно отследить на Github: https://github.com/Azure/azure-webjobs-sdk/issues/2234

enter image description here

Соответствующий код (Microsoft.Azure.WebJobs.ServiceBus.Triggers.UserTypeArgumentBindingProvider)

 private static TInput GetBody(Message message, ValueBindingContext context)
        {
            if (message.ContentType == ContentTypes.ApplicationJson) //This is looking at the message type
            {
                string contents;

                contents = StrictEncodings.Utf8.GetString(message.Body);

                try
                {
                    return JsonConvert.DeserializeObject<TInput>(contents, Constants.JsonSerializerSettings);
                }
                catch (JsonException e)
                {
                    // Easy to have the queue payload not deserialize properly. So give a useful error. 
                    string msg = string.Format(
    @"Binding parameters to complex objects (such as '{0}') uses Json.NET serialization. 
    1. Bind the parameter type as 'string' instead of '{0}' to get the raw values and avoid JSON deserialization, or
    2. Change the queue payload to be valid json. The JSON parser failed: {1}
    ", typeof(TInput).Name, e.Message);
                    throw new InvalidOperationException(msg);
                }
            }
            else
            {
                return message.GetBody<TInput>();
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...