Сбой десериализации Servicebustrigger - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть простое веб-задание, которое использует servicebus:

   public async Task ProcessQueueMessage([ServiceBusTrigger("asset-updates-in")] BrokeredMessage message,
        ILogger log)
    {
        log.LogInformation("Running job");
        log.LogInformation("GotMessage"+ message.ContentType);

Сообщение отправлено командой Biztalk, имеет тип MIME 'text / xml' и выглядит так:

 <gip:GetDeviceUpdateResult xmlns:gip="http://schemas.ores.net/customer/breakdown-manager/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <gip:Event>
        <gip:Id>5886</gip:Id>
        <gip:Action>Upsert</gip:Action>
        <gip:Timestamp>2019-09-20T13:35:40</gip:Timestamp>
      </gip:Event>
      <gip:Cabin>
        <gip:Id>5001874</gip:Id>
        <gip:BusinessId>029843</gip:BusinessId>
        <gip:Name>RUE DE LANDEN TEST 2</gip:Name>
        <gip:DistrictId>1590</gip:DistrictId>
      </gip:Cabin>
    </gip:GetDeviceUpdateResult>

Как только мой webjob получает сообщение, у меня появляется эта ошибка:

Microsoft.Azure.WebJobs.Host.FunctionInvocationException: исключение при выполнении функции: UpdateFunctions.ProcessQueueMessage ---> System.InvalidOperationException: Exceptionпараметр привязки 'message' ---> System.InvalidOperationException: Привязка параметров к сложным объектам (таким как 'BrokeredMessage') использует сериализацию Json.NET или сериализацию объектов XML.

  1. Если ContentType равен 'application /json 'десериализовать как JSON
  2. Если ContentType не является' application / json ', попытка десериализации с помощью Message.GetBody, которая будет обрабатывать такие случаи, как сериализация объектов XML
  3. Если эта десериализация завершится неудачно, выполните финальнуюпопытка десериализации JSON для обнаружения случаев, когда тип содержимого может быть неправильным

Сбой синтаксического анализатора JSON: при анализе значения обнаружен неожиданный символ:?.Путь '', строка 0, позиция 0.

Так что, похоже, используется парсер json, когда данные в формате xml: ... 1023 *

Если я изменю свою веб-работу следующим образом:

 public async Task ProcessQueueMessage([ServiceBusTrigger("asset-updates-in")] string message,
        ILogger log)
    {
        log.LogInformation("Running job");
        log.LogInformation("GotMessage"+ message);

Я получаю:

[09/20/2019 11:38:43 > da4c4f: INFO]       GotMessage<?xml version="1.0" encoding="utf-8"?><gip:GetDeviceUpdateResult xmlns:gip="http://schemas.ores.net/customer/breakdown-manager/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><gip:Event><gip:Id>5889</gip:Id><gip:Action>Upsert</gip:Action><gip:Timestamp>2019-09-20T13:38:11</gip:Timestamp></gip:Event><gip:Cabin><gip:Id>5001874</gip:Id><gip:BusinessId>029843</gip:BusinessId><gip:Name>RUE DE LANDEN</gip:Name><gip:DistrictId>1590</gip:DistrictId></gip:Cabin></gip:GetDeviceUpdateResult>
[09/20/2019 11:38:43 > da4c4f: INFO] info: Function.ProcessQueueMessage[0]

Я думаю, что могу десериализовать себя, но это немного воняет ... Я что-то упускаю?

Спасибо!

1 Ответ

1 голос
/ 23 сентября 2019

Это потому, что класс BrokeredMessage устарел в webjob 3.x.В SDK WebJobs версии 3.x используется новый клиент служебной шины .NET Standard (Microsoft.Azure.ServiceBus с классом Message ).

Таким образом, вы можете использовать это для десериализации.

public static void processservicebus(
        [ServiceBusTrigger("myqueue", Connection = "ServiceBusConnection")]Message message,
        ILogger log)
        {

            log.LogInformation(message.ContentType);

            XDocument orderOut = XDocument.Parse(Encoding.UTF8.GetString(message.Body));

        }

enter image description here

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