Azure служебная шина Сообщение десериализации прервано при преобразовании ядра - PullRequest
0 голосов
/ 22 февраля 2020

Итак, я создал новый проект Azure Functions v3 и портирую его на подмножество функций из v1, которые работали на 4.6.2, а остальные удаляются как устаревшие. К сожалению, при переходе от BrokeredMessage к Message из-за перехода с Microsoft.ServiceBus.Messaging на Microsoft. Azure .ServiceBus теперь происходит сбой следующего метода десериализации:

Произошла ошибка десериализации объекта типа потока. Неправильно отформатирован входной источник.

Проблема заключается в ошибке, но я не уверен, каков правильный новый подход, он немного неясен.

Сериализация

public static Message CreateBrokeredMessage(object messageObject)
{

       var message = new Message(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(messageObject)))
       {
           ContentType = "application/json",
           Label = messageObject.GetType().Name

       };

       return message;
}

Десериализация

public static T ParseBrokeredMessage<T>(Message msg)
{
     var body = msg.GetBody<Stream>();
     var jsonContent = new StreamReader(body, true).ReadToEnd();
     T updateMessage = JsonConvert.DeserializeObject<T>(jsonContent);

     return updateMessage;
}

Объект

                   var fileuploadmessage = new PlanFileUploadMessage()
                    {
                        PlanId = file.Plan_Id.Value,
                        UploadedAt = uploadTimeStamp,
                        UploadedBy = uploadUser,
                        FileHash = uploadedFileName,
                        FileName = file.Name,
                        BusinessUnitName = businessUnitName,
                        UploadedFileId = uploadedFile.Id
                    };
    ```

1 Ответ

1 голос
/ 22 февраля 2020

Message.GetBody<T>() - это метод расширения для сообщений, отправляемых с использованием устаревшего SDK служебной шины (пакет WindowsAzure .ServiceBus), где BrokeredMessage заполнено чем-либо, кроме Stream. Если ваш отправитель отправляет массив байтов, как вы показали, вы должны получить к нему доступ, используя свойство Message.Body.

В случае, если ваше сообщение отправлено как BrokeredMessage, принимающему коду нужно будет выбрать либо методов, основанных на некоторой информации, чтобы указать, как сообщение было отправлено первоначально.

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