Servicebustrigger反序列化失败
Servicebustrigger deserialization fails
我有一个使用服务总线的简单网络作业:
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>
一旦我的 webjob 收到消息,我就会收到此错误消息:
Microsoft.Azure.WebJobs.Host.FunctionInvocationException: Exception
while executing function: UpdateFunctions.ProcessQueueMessage --->
System.InvalidOperationException: Exception binding parameter
'message' ---> System.InvalidOperationException: Binding parameters to
complex objects (such as 'BrokeredMessage') uses Json.NET
serialization or XML object serialization.
- If ContentType is 'application/json' deserialize as JSON
- If ContentType is not 'application/json' attempt to deserialize using Message.GetBody, which will handle cases like XML object
serialization
- If this deserialization fails, do a final attempt at JSON deserialization to catch cases where the content type might be
incorrect
The JSON parser failed: Unexpected character encountered while parsing
value: ?. Path '', line 0, position 0.
所以它似乎使用 json 解析器,而数据是 xml 来自...
如果我这样更改我的网络作业:
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]
我想我可以反序列化自己,但它有点臭......我错过了什么?
谢谢!
这是因为 BrokeredMessage
class 在网络作业 3.x 中已弃用。
WebJobs SDK 版本 3.x 使用新的 .NET Standard 服务总线客户端(Microsoft.Azure.ServiceBus
和 Message class)。
所以你可以用它来反序列化它。
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));
}
我有一个使用服务总线的简单网络作业:
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>
一旦我的 webjob 收到消息,我就会收到此错误消息:
Microsoft.Azure.WebJobs.Host.FunctionInvocationException: Exception while executing function: UpdateFunctions.ProcessQueueMessage ---> System.InvalidOperationException: Exception binding parameter 'message' ---> System.InvalidOperationException: Binding parameters to complex objects (such as 'BrokeredMessage') uses Json.NET serialization or XML object serialization.
- If ContentType is 'application/json' deserialize as JSON
- If ContentType is not 'application/json' attempt to deserialize using Message.GetBody, which will handle cases like XML object serialization
- If this deserialization fails, do a final attempt at JSON deserialization to catch cases where the content type might be incorrect
The JSON parser failed: Unexpected character encountered while parsing value: ?. Path '', line 0, position 0.
所以它似乎使用 json 解析器,而数据是 xml 来自...
如果我这样更改我的网络作业:
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]
我想我可以反序列化自己,但它有点臭......我错过了什么?
谢谢!
这是因为 BrokeredMessage
class 在网络作业 3.x 中已弃用。
WebJobs SDK 版本 3.x 使用新的 .NET Standard 服务总线客户端(Microsoft.Azure.ServiceBus
和 Message class)。
所以你可以用它来反序列化它。
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));
}