1

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

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

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

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

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

执行函数时出现异常:Applications Microsoft.Azure.WebJobs.Host.FunctionInvocationException:执行函数时出现异常:Applications ---> System.Runtime.Serialization.SerializationException:反序列化 System.String 类型的对象时出错。输入源的格式不正确。---> System.Xml.XmlException : 输入源格式不正确。

4

1 回答 1

1

在您的发送代码中,消息正文作为流发送(字节按原样发送且未编码)。你用来接收旧版 Azure 服务总线库的代码需要从这些字节中反序列化字符串。在编码方面,您应该使用相同的发送和接收方法。即你应该得到一个Streamusingmessage.GetBody<Stream>并从流中读取字节并在需要时反序列化。更多信息在这里

为了能够按原样检索字符串message.GetBody<string>,您需要更改发件人的代码以发送 DataContract 二进制序列化字符串。请参阅此处了解如何操作。

于 2019-08-13T20:27:33.270 回答