У меня есть очередь хранения, на которую я отправляю сообщения, построенные с использованием конструктора CloudQueueMessage(byte[])
. Затем я попытался обработать сообщения в функции webjob со следующей подписью:Azure WebJobs QueueTrigger пытается (и не удается) преобразовать тело байта [] в строку
public static void ConsolidateDomainAuditItem([QueueTrigger("foo")] CloudQueueMessage msg)
я получаю последовательный отказ с исключением
Microsoft.Azure.WebJobs.Host.FunctionInvocationException: Exception while executing function: Program.ConsolidateDomainAuditItem ---> System.InvalidOperationException: Exception binding parameter 'msg' ---> System.Text.DecoderFallbackException: Unable to translate bytes [FF] at index -1 from specified code page to Unicode.
at System.Text.DecoderExceptionFallbackBuffer.Throw(Byte[] bytesUnknown, Int32 index)
at System.Text.DecoderExceptionFallbackBuffer.Fallback(Byte[] bytesUnknown, Int32 index)
at System.Text.DecoderFallbackBuffer.InternalFallback(Byte[] bytes, Byte* pBytes)
at System.Text.UTF8Encoding.GetCharCount(Byte* bytes, Int32 count, DecoderNLS baseDecoder)
at System.String.CreateStringFromEncoding(Byte* bytes, Int32 byteLength, Encoding encoding)
at System.Text.UTF8Encoding.GetString(Byte[] bytes, Int32 index, Int32 count)
at Microsoft.WindowsAzure.Storage.Queue.CloudQueueMessage.get_AsString()
at Microsoft.Azure.WebJobs.Host.Storage.Queue.StorageQueueMessage.get_AsString()
at Microsoft.Azure.WebJobs.Host.Queues.Triggers.UserTypeArgumentBindingProvider.UserTypeArgumentBinding.BindAsync(IStorageQueueMessage value, ValueBindingContext context)
at Microsoft.Azure.WebJobs.Host.Queues.Triggers.QueueTriggerBinding.<BindAsync>d__0.MoveNext()
Глядя на код UserTypeArgumentBindingProvider.BindAsync
, он явно ожидает передачи сообщение, тело которого является объектом JSON. И имя UserType...
имени также подразумевает, что он ожидает привязки POCO.
Однако в статье MSDN How to use Azure queue storage with the WebJobs SDK четко говорится, что
Вы можете использовать QueueTrigger со следующими типами: тип
string
- ПОКО сериализованная в формате JSON
byte[]
CloudQueueMessage
Так почему это не обязывает мое сообщение?
Имя параметра никак не влияет на логику привязки - вы можете назвать его как хотите. Возможно, произошли некоторые другие изменения, из-за которых ваша функция начала работать? Это не может быть имя параметра :) – mathewc