从Azure Service Bus接收消息时出现System.Runtime.Serialization.SerializationException

时间:2019-08-13 18:14:44

标签: c# .net-core azureservicebus brokeredmessage azure-webjobs-triggered

我有两个独立的应用程序,一个是 .Net Core ,另一个是在 .Net Framework 中。我已经在.Net核心控制台应用程序中创建了服务总线发送器。它正在使用最新的Microsoft.Azure.WebjobsMicrosoft.Azure.Webjobs.ServiceBus nuget包向服务总线发送消息。这是发件人的示例代码。

var message = new Message(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(request)));
var client = new TopicClient(connectionString, TopicName);
await client.SendAsync(message);

.NET Framework 4.7中编写的另一个应用程序正在侦听同一服务总线。它正在使用.net Framework的2.3.0版本的nuget软件包Microsoft.Azure.WebjobsMicrosoft.Azure.Webjobs.ServiceBus。下面的示例代码。

public class ListenJob
{
    public static void Listen([ServiceBusTrigger("%TopicName%", "%SubscriptionName%")] BrokeredMessage message)
    {
        var messageBody = message.GetBody<string>();
    }
}

从.Net核心控制台应用程序发送消息时。另一个应用程序能够检测到该消息,但是我在侦听器中的第var messageBody = message.GetBody<string>();行出现了以下错误。

  

执行函数时发生异常:   应用领域   Microsoft.Azure.WebJobs.Host.FunctionInvocationException:异常   在执行功能时:   应用程序--->   System.Runtime.Serialization.SerializationException:存在一个   反序列化类型为System.String的对象时出错。输入源   格式不正确。 ---> System.Xml.XmlException:输入   来源格式不正确。

1 个答案:

答案 0 :(得分:1)

在您的发送代码中,消息主体作为流发送(字节按原样发送且未编码)。您用来与旧版Azure Service Bus库一起接收的代码期望从这些字节中反序列化一个字符串。编码时,应使用相同的发送和接收方法。即您应该使用Stream得到一个message.GetBody<Stream>,并从流中读取字节并在需要时反序列化。更多信息here

要能够按原样使用message.GetBody<string>作为字符串进行检索,您需要更改发送者的代码以发送DataContract二进制序列化字符串。有关如何操作,请参见here