- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
总之,我有一个链接到 CloudQueue
的 Azure Web 作业通过 WebJobs SDK 的 ProcessQueueMessage
机制,使用 CloudQueueMessage
参数类型。这给了我一个FunctionInvocationException
当通过 QueueTrigger
触发时.
详情
该项目已成功添加到 CloudQueue
使用AddMessageAsync
方法:
await queue.AddMessageAsync(new CloudQueueMessage(JsonConvert.SerializeObject(myObject)));
并作为我的对象的预期 JSON 表示形式出现在队列中(来自 Cloud Explorer 中的消息文本预览):
{"EmailAddress":"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="ff9a879e928f939abf929e9693d19c9092" rel="noreferrer noopener nofollow">[email protected]</a>",
"Subject":"Test",
"TemplateId":"00-00-00-00-00",
"Model":{"PropertyName1":"Test1","PropertyName2":"Test2"}
}
但是,当 ProcessQueueMessage
方法被触发:
public static async void ProcessQueueMessage(
[QueueTrigger(queueName)] CloudQueueMessage message, TextWriter log)
...我得到一个FunctionInvocationException
:
Microsoft.Azure.WebJobs.Host.FunctionInvocationException: Exception while executing function: Functions.ProcessQueueMessage ---> System.InvalidOperationException: Exception binding parameter 'message' ---> System.ArgumentNullException: String reference not set to an instance of a String.
Parameter name: s
at System.Text.Encoding.GetBytes(String s)
at Microsoft.WindowsAzure.Storage.Queue.CloudQueueMessage.get_AsBytes() in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\Common\Queue\CloudQueueMessage.Common.cs:line 146
at Microsoft.Azure.WebJobs.Host.PropertyHelper.CallPropertyGetter[TDeclaringType,TValue](Func`2 getter, Object this)
at Microsoft.Azure.WebJobs.Host.PropertyHelper.GetValue(Object instance)
at Microsoft.Azure.WebJobs.Host.Bindings.BindingDataProvider.GetBindingData(Object value)
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()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.Azure.WebJobs.Host.Triggers.TriggeredFunctionBinding`1.<BindCoreAsync>d__7.MoveNext()
--- End of inner exception stack trace ---
at Microsoft.Azure.WebJobs.Host.Executors.DelayedException.Throw()
at Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.<ExecuteWithWatchersAsync>d__31.MoveNext()
--- End of stack trace from previous location where exception was thrown
这似乎表明 message
参数无法将 JSON 读入 CloudQueueMessage
对象...但它似乎不是我可以控制的。
有人对为什么会发生这种情况有任何建议吗?
<小时/>版本信息
微软.Azure.Webjobs 1.1.1
WindowsAzure.Storage 6.2.2-预览版
DNX 4.5.1
背景
最佳答案
更改您的 ProcessQueueMessage 以接受一个字符串(这是您实际传递给 CloudQueuMessage 的字符串),然后将其反序列化为您的对象:
public static async void ProcessQueueMessage(
[QueueTrigger(queueName)] string message, TextWriter log)
{
JsonConvert.DeserializeObject<YourObjectType>(json);
}
或者更好的是,如果这是一个 POCO 对象,那么您所要做的就是使用它:
public static async void ProcessQueueMessage
(
[QueueTrigger(queueName)] YourObjectType message,
TextWriter log
)
{ //.... }
更新:虽然在 CloudQueueMessage 对象中获取整个内容会很好,但要获取在 CloudQueueMessage 中发送的属性,您可以将以下参数添加到 webjob 方法中:
public static async void ProcessQueueMessage(
[QueueTrigger(queueName)] string logMessage,
DateTimeOffset expirationTime,
DateTimeOffset insertionTime,
DateTimeOffset nextVisibleTime,
string id,
string popReceipt,
int dequeueCount,
string queueTrigger,
CloudStorageAccount cloudStorageAccount,
TextWriter logger)
{
logger.WriteLine(
"logMessage={0}\n" +
"expirationTime={1}\ninsertionTime={2}\n" +
"nextVisibleTime={3}\n" +
"id={4}\npopReceipt={5}\ndequeueCount={6}\n" +
"queue endpoint={7} queueTrigger={8}",
logMessage, expirationTime,
insertionTime,
nextVisibleTime, id,
popReceipt, dequeueCount,
cloudStorageAccount.QueueEndpoint,
queueTrigger);
}
关于Azure WebJob ProcessQueueMessage 无法读取 CloudQueueMessage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35779547/
我使用 Azure 存储队列来处理我的项目处理流程。任务正在进入队列,由后台服务器处理并从队列中删除。 在某些情况下,某些任务的处理会失败(由于环境变量 - 这是不可预期的)。在这种情况下,我想再次重
根据 MSDN , Message payload 可以扩展到 8KB (8192 bytes): The AddMessage method adds a message to the back o
我有一个CloudQueueMessage,我想插入“Hello World” - 所以我写: CloudQueueMessage message = new CloudQueueMessage("H
总之,我有一个链接到 CloudQueue 的 Azure Web 作业通过 WebJobs SDK 的 ProcessQueueMessage机制,使用 CloudQueueMessage参数类型。
总之,我有一个链接到 CloudQueue 的 Azure Web 作业通过 WebJobs SDK 的 ProcessQueueMessage机制,使用 CloudQueueMessage参数类型。
由于 64k 消息大小限制,我需要压缩字符串输入。 在文档中,它说有一个接受 byte[] 的公共(public)构造函数: public CloudQueueMessage (byte[] cont
我使用 Microsoft.WindowsAzure.Storage.Queue 库通过以下代码将消息从 Azure Function 推送到存储队列: public void Enqueue(MyM
创建新的 QueueTrigger Azure 函数时,我想将 string 输入切换到 CloudQueueMessage。 我已将签名更改为: 公共(public)异步静态任务运行([QueueT
我是一名优秀的程序员,十分优秀!