【问题标题】:Servicebustrigger deserialization failsServicebustrigger 反序列化失败
【发布时间】:2019-09-23 15:58:17
【问题描述】:

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

   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>

只要我的网络作业收到消息,我就会出现此错误:

Microsoft.Azure.WebJobs.Host.FunctionInvocationException:异常 执行函数时:UpdateFunctions.ProcessQueueMessage ---> System.InvalidOperationException:异常绑定参数 'message' ---> System.InvalidOperationException:将参数绑定到 复杂对象(例如“BrokeredMessage”)使用 Json.NET 序列化或 XML 对象序列化。

  1. 如果 ContentType 为 'application/json' 则反序列化为 JSON
  2. 如果 ContentType 不是 'application/json' 尝试使用 Message.GetBody 进行反序列化,这将处理 XML 对象等情况 序列化
  3. 如果此反序列化失败,请最后尝试 JSON 反序列化以捕获内容类型可能为 不正确

JSON 解析器失败:解析时遇到意外字符 价值: ?。路径'',第 0 行,第 0 位置。

所以似乎在数据是 xml fromat 时使用 json 解析器...

如果我这样改变我的网络工作:

 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]

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

谢谢!

【问题讨论】:

    标签: c# azure-webjobs


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 2021-08-28
      相关资源
      最近更新 更多