Servicebustrigger反序列化失败

Servicebustrigger deserialization fails

我有一个使用服务总线的简单网络作业:

   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: Exception while executing function: UpdateFunctions.ProcessQueueMessage ---> System.InvalidOperationException: Exception binding parameter 'message' ---> System.InvalidOperationException: Binding parameters to complex objects (such as 'BrokeredMessage') uses Json.NET serialization or XML object serialization.

  1. If ContentType is 'application/json' deserialize as JSON
  2. If ContentType is not 'application/json' attempt to deserialize using Message.GetBody, which will handle cases like XML object serialization
  3. If this deserialization fails, do a final attempt at JSON deserialization to catch cases where the content type might be incorrect

The JSON parser failed: Unexpected character encountered while parsing value: ?. Path '', line 0, position 0.

所以它似乎使用 json 解析器,而数据是 xml 来自...

如果我这样更改我的网络作业:

 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]

我想我可以反序列化自己,但它有点臭......我错过了什么?

谢谢!

这是因为 BrokeredMessage class 在网络作业 3.x 中已弃用。 WebJobs SDK 版本 3.x 使用新的 .NET Standard 服务总线客户端(Microsoft.Azure.ServiceBusMessage class)。

所以你可以用它来反序列化它。

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));

        }