0

У меня есть очередь хранения, на которую я отправляю сообщения, построенные с использованием конструктора 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

Так почему это не обязывает мое сообщение?

ответ

0

Связывание параметров WebJobs SDK в значительной степени зависит от имен магических параметров. Хотя [QueueTrigger(...)] string, по-видимому, разрешает любое имя параметра (и изделие MSDN включает в качестве примеров logMessage, inputText, queueMessage, blobName), [QueueTrigger(...)] CloudQueueMessage требует, чтобы этот параметр назывался message. Изменение имени параметра от msg до message фиксирует привязку.

К сожалению, я не знаю какой-либо документации, в которой говорится об этом явно.

+1

Имя параметра никак не влияет на логику привязки - вы можете назвать его как хотите. Возможно, произошли некоторые другие изменения, из-за которых ваша функция начала работать? Это не может быть имя параметра :) – mathewc

0

Попробуйте вместо этого:

государственной статической силы ConsolidateDomainAuditItem ([QueueTrigger ("Foo")] байт [] сообщение)

CloudQueueMessage обертка, как правило, переплеты избавиться от обертки и позволяют вам вместо этого обрабатывать контент.

Смежные вопросы