And*_*son 6 c# json servicebus azure-logic-apps
我正在尝试在Azure Logic App中阅读邮件的内容正文,但我没有取得多大成功.我看到很多建议说主体是base64编码的,建议使用以下代码进行解码:
@{json(base64ToString(triggerBody()?['ContentData']))}
Run Code Online (Sandbox Code Playgroud)
该base64ToString(...)部分正在将内容正确解码为字符串,但该字符串似乎包含一个前缀,其中包含一些额外的序列化信息:
@string3http://schemas.microsoft.com/2003/10/Serialization/?3{"Foo":"Bar"}
Run Code Online (Sandbox Code Playgroud)
该字符串中还有一些额外的字符未在我的浏览器中显示.因此该json(...)函数不接受输入,而是给出错误.
InvalidTemplate.无法在第1行和第2451行的"HTTP"输入中处理模板语言表达式:'模板语言函数'json'参数无效.
@string3http://schemas.microsoft.com/2003/10/Serialization/?3{"Foo":"bar" }无法解析提供的值 :Unexpected character encountered while parsing value: @. Path '', line 0, position 0..有关使用详情,请参阅https://aka.ms/logicexpressions#json.'.
作为参考,使用.NET服务总线客户端将消息添加到主题中(客户端应该无关紧要,但这看起来更像C#-ish):
await TopicClient.SendAsync(new BrokeredMessage(JsonConvert.SerializeObject(item)));
Run Code Online (Sandbox Code Playgroud)
如何在Logic App中将其正确读取为JSON对象?
这是由消息在 ServiceBus 上的放置方式(特别是 C# 代码中的放置方式)引起的。我使用以下代码添加新消息:
var json = JsonConvert.SerializeObject(item);
var message = new BrokeredMessage(json);
await TopicClient.SendAsync(message);
Run Code Online (Sandbox Code Playgroud)
这段代码看起来不错,并且在不同的 C# 服务之间工作没有问题。BrokeredMessage(Object)该问题是由构造函数序列化给它的有效负载的方式引起的:
使用带有二进制 XmlDictionaryWriter 的 DataContractSerializer 从给定对象初始化 BrokeredMessage 类的新实例。
这意味着内容被序列化为二进制 XML,这解释了前缀和无法识别的字符。反序列化时,这一点被 C# 实现隐藏,并返回您期望的对象,但在使用不同的库(例如 Azure 逻辑应用程序使用的库)时,它会变得明显。
有两种方法可以解决此问题:
Paco de la Cruz 的答案处理第一种情况,使用substring,indexOf和lastIndexOf:
@json(substring(base64ToString(triggerBody()?['ContentData']), indexof(base64ToString(triggerBody()?['ContentData']), '{'), add(1, sub(lastindexof(base64ToString(triggerBody()?['ContentData']), '}'), indexof(base64ToString(triggerBody()?['ContentData']), '}')))))
Run Code Online (Sandbox Code Playgroud)
对于第二种情况,从源头上解决问题只需使用BrokeredMessage(Stream)构造函数即可。这样,我们就可以直接控制内容:
var json = JsonConvert.SerializeObject(item);
var bytes = Encoding.UTF8.GetBytes(json);
var stream = new MemoryStream(bytes);
var message = new BrokeredMessage(stream, true);
await TopicClient.SendAsync(message);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1206 次 |
| 最近记录: |