使用azure逻辑应用程序将消息作为字符串发送到azure服务总线

2024-05-02

我正在使用逻辑应用操作“发送消息”向服务总线主题发送消息。在控制台应用程序中读取它时,如果我这样做:

SubscriptionClient subClient = SubscriptionClient.CreateFromConnectionString(connstr, topicName, subscriptionName);
OnMessageOptions options = new OnMessageOptions();
options.AutoComplete = true; 
options.MaxConcurrentCalls = 1;  
subClient.OnMessage((message) => {
    string sjson = null;
    try
    {
        sjson = message.GetBody<string>();
        Console.WriteLine(sjson);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
}, options);

它抛出以下异常:

System.Runtime.Serialization.SerializationException: There was an error deserializing the object of type System.String. The input source is not correctly formatted. 
---> System.Xml.XmlException: The input source is not correctly formatted.
at System.Xml.XmlExceptionHelper.ThrowXmlException(XmlDictionaryReader reader, String res, String arg1, String arg2, String arg3)
at System.Xml.XmlBufferReader.ReadValue(XmlBinaryNodeType nodeType, ValueHandle value)at System.Xml.XmlBinaryReader.ReadNode() 
at System.Xml.XmlBinaryReader.Read() 
at System.Xml.XmlBaseReader.IsStartElement() 
at System.Xml.XmlBaseReader.IsStartElement(XmlDictionaryString localName, XmlDictionaryString namespaceUri)  
at System.Runtime.Serialization.XmlReaderDelegator.IsStartElement(XmlDictionaryString localname, XmlDictionaryString ns) 
at System.Runtime.Serialization.XmlObjectSerializer.IsRootElement(XmlReaderDelegator reader, DataContract contract, XmlDictionaryString name, XmlDictionaryString ns)
at System.Runtime.Serialization.DataContractSerializer.InternalIsStartObject(XmlReaderDelegator reader)  
at System.Runtime.Serialization.DataContractSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName, DataContractResolver dataContractResolver) 
at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver)--- End of inner exception stack trace ---at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver)at System.Runtime.Serialization.DataContractSerializer.ReadObject(XmlDictionaryReader reader, Boolean verifyObjectName)  
at Microsoft.ServiceBus.Messaging.DataContractBinarySerializer.ReadObject(XmlDictionaryReader reader, Boolean verifyObjectName)  
at System.Runtime.Serialization.XmlObjectSerializer.ReadObject(XmlReader reader, Boolean verifyObjectName)at System.Runtime.Serialization.XmlObjectSerializer.InternalReadObject(XmlReaderDelegator reader, Boolean verifyObjectName)  
at System.Runtime.Serialization.XmlObjectSerializer.InternalReadObject(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver)at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver)at System.Runtime.Serialization.XmlObjectSerializer.ReadObject(XmlDictionaryReader reader)at Microsoft.ServiceBus.Messaging.DataContractBinarySerializer.ReadObject(Stream stream) 
at Microsoft.ServiceBus.Messaging.BrokeredMessage.GetBody[T](XmlObjectSerializer serializer)  
at Microsoft.ServiceBus.Messaging.BrokeredMessage.GetBody[T]() 

事实证明,逻辑应用程序将消息作为流而不是字符串发送,这就是引发异常的原因。因为,如果我这样做,控制台应用程序就能够读取消息:

SubscriptionClient subClient = SubscriptionClient.CreateFromConnectionString(connstr, topicName, subscriptionName);
OnMessageOptions options = new OnMessageOptions();
options.AutoComplete = true; 
options.MaxConcurrentCalls = 1;  
subClient.OnMessage((message) => {
    Stream stream;
    StreamReader reader;
    string messageJson;
    try
    {
        stream = message.GetBody<Stream>();
        reader = new StreamReader(stream);
        messageJson = reader.ReadToEnd();
        Console.WriteLine(messageJson);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
}, options);

所以,我的问题是,有没有办法让逻辑应用程序以字符串而不是流的形式发送消息?或者这是逻辑应用程序的限制?

我尝试过在逻辑应用程序操作中使用“application/json”、“System.String”和“text/plain”作为消息的内容类型,但它不起作用。


不幸的是,不可能改变尸体的交付方式。为了解决这个问题,我们用一个辅助方法更新了监听器,该方法尝试找出主体的类型并相应地提取:

private static JObject GetBody(BrokeredMessage brokeredMessage)
        {
            string objAsJson;
            object objIsStream;

            brokeredMessage.Properties.TryGetValue("isStream", out objIsStream);
            bool bIsStream = objIsStream != null ? (bool)objIsStream : brokeredMessage.DeliveryCount % 2 == 0; // Default delivery method is String; Retry String as Stream if it fails

            if (bIsStream)
            {
                // Azure Functions and Logic Apps send messages as Stream
                // Service Bus Explorer defaults to Stream but can send as String
                Stream stream = brokeredMessage.GetBody<Stream>();
                StreamReader reader = new StreamReader(stream);
                objAsJson = reader.ReadToEnd();
            }
            else
            {
                // Our services send messages as String
                objAsJson = brokeredMessage.GetBody<string>();
            }

            return JObject.Parse(objAsJson);
        }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用azure逻辑应用程序将消息作为字符串发送到azure服务总线 的相关文章

  • 性能 - String.charAt(0) 与 /^.{1}/

    从概念上讲哪个应该更快 String charAt 0 or 1 regex String charAt 0 必须处理和应用正则表达式 速度测试资源 Paul S https stackoverflow com users 1615483
  • String.substring 在 Java 中到底做了什么?

    我一直想如果我这样做String s Hello World substring 0 5 然后我就得到一个新字符串s Hello Java API 文档中也记录了这一点 返回一个新字符串 该字符串是该字符串的子字符串 但当我看到下面两个链接
  • 我需要转义该 MATLAB 字符串中的字符吗?

    我想在 MATLAB 中调用以下 bash 命令 grep Up to test linux vision1 1 log awk print 7 I use system 在MATLAB中 但结果有错误 gt gt status strin
  • 如何从 ctype 结构构建 python 字符串?

    我正在使用 ctypes 并且定义了这个结构体以便传递参数 class my struct ctypes Structure fields buffer ctypes c char BUFSIZE size ctypes c int 然后我
  • 将由空格分隔的整数字符串更改为 int 列表[重复]

    这个问题在这里已经有答案了 我该如何做类似的东西 x 1 2 3 45 87 65 6 8 gt gt gt foo x 1 2 3 45 87 65 6 8 我完全陷入困境 如果我按索引执行此操作 那么超过 1 位数字的数字将被分解 请帮
  • 将长字符串分成 60 个字符的长行,但不要断词

    必须有更好的方法来做到这一点 我只想将长字符串拆分为 60 个字符行 但不要断词 因此 不必添加最多 60 个字符 只需少于 60 个即可 下面的代码是我所拥有的并且它有效 但我认为还有更好的方法 有人吗 修改为使用StringBuilde
  • fgets 读取的最大大小

    Using fgets要输入字符串 我对读取的字符串长度有疑问 例如 考虑以下程序 char str 50 int i int len printf Enter name n fgets str 11 stdin len strlen st
  • HttpRequest PUT内容到poco库中

    我想使用 HTTP PUT 请求将一些数据从 C 应用程序发送到服务器 我在用poco http pocoproject org我的应用程序中的网络库 我正在使用这个代码片段 HTTPClientSession session uri ge
  • 如何逐行解析文本区域中的用户输入

    如果我有一个包含文本信息的变量 比如从文本区域获取 如何逐行读取字符串变量中保存的文本内容 在文本区域中输入的文本将以 n 输入键 来分隔行 您可以使用StringReader http msdn microsoft com en us l
  • 字符串插值搜索

    对于那些不熟悉插值搜索的人来说 这是一种在排序数组中搜索值的方法 可能比二分搜索更快 您查看第一个和最后一个元素 并 假设数组的内容均匀分布 线性插值以预测位置 例如 我们有一个长度为 100 的数组 其中 array 0 0 和 arra
  • 节点:使用 Nodemailer 的直通流

    我正在使用officegen 生成一个Word 文档 然后计划使用Nodemailer 和Sendgrid 将其附加到电子邮件中 Officegen 输出一个流 但我更愿意将其直接传递到附件 而不是在本地保存 Word 文档然后附加它 Ge
  • Golang中如何删除字符串的最后一个字符?

    我想删除字符串的最后一个字符 但在此之前我想检查最后一个字符是否是 如何才能做到这一点 以下是删除尾随加号的几种方法 package main import fmt strings func TrimSuffix s suffix stri
  • 有谁知道一种更快的方法来执行 String.Split() 吗?

    我正在读取 CSV 文件的每一行 并且需要获取每一列中的各个值 所以现在我只是使用 values line Split delimiter where line是保存由分隔符分隔的值的字符串 衡量我的表现ReadNextRow我注意到它花费
  • 当字符串的长度大于n时,如何打印字符串的前n个字节?

    所以我有一个具有一定字节数 或长度 的字符串 我说字节是因为字符串末尾没有 NULL 终止符 不过 我知道绳子有多长 通常 众所周知 当您printf s str 它将继续打印每个字节 直到到达 NULL 字符 我知道没有 C 字符串不是
  • 在字符串中间添加一个字符

    可能有一个简单的解决方案可以解决这个问题 但会引起面部表情 我将时间存储为 4 个字符长的字符串 即 1300 我试图将该字符串显示为 13 00 我觉得必须有一个比我现在正在做的更优雅的解决方案 我目前有 startTime get fi
  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • 如何计算特定字符在字符串中出现的次数

    我正在尝试创建一个函数来查看数组中的任何字符是否在字符串中 如果是 有多少个 我尝试计算每一种模式 但是太多了 我尝试使用 Python 中的 in 运算符的替代方案 但效果不佳 function calc fit element var
  • 如何替换 pandas 数据框列中的重音符号

    我有一个数据框dataSwiss其中包含瑞士城市的信息 我想用普通字母替换带有重音符号的字母 这就是我正在做的 dataSwiss Municipality dataSwiss Municipality str encode utf 8 d
  • 从字符串末尾删除多个字符类型

    我有一个构建地址字段的循环 其中一些字段在字符串末尾可能为空 List
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在

随机推荐