我遇到了一个奇怪的问题,即我的网络工作间歇性地继续失败。
为简要概述当前流程,我的Web作业与从中获取自定义对象的队列触发器相关联:
public async Task ProcessClientUsageQueueMessage(
[QueueTrigger("clientusageupdated")] ClientUsage clientUsageMessage,
TextWriter log)
{
log.WriteLine("Message received: {0}", JsonConvert.SerializeObject(clientUsageMessage));
var clientReference = clientUsageMessage.ClientReference;
await ProcessClientUsage(clientReference, log);
}
然后,ProcessClientUsage继续通过混合连接从本地SQL服务器查询数据。不幸的是,存储过程必须筛选大量数据,导致此调用有时需要大约10分钟才能完成。
public async Task<IEnumerable<ClientUsageDetail>> GetClientUsage(Client client)
{
using (SqlConnection connection = new SqlConnection(client.ClientDatabaseConnectionString))
using (SqlCommand command = new SqlCommand { CommandText = "[Oracle].[_GetUsage]", Connection = connection, CommandType = System.Data.CommandType.StoredProcedure, CommandTimeout = 2000 })
{
command.Parameters.Add(new SqlParameter { ParameterName = "@KeepForDays", SqlDbType = SqlDbType.Int, Direction = ParameterDirection.Input, Value = client.DaysRetention ?? 40 });
command.Parameters.Add(new SqlParameter { ParameterName = "@LatestEventDetailID", SqlDbType = SqlDbType.BigInt, Direction = ParameterDirection.Input, Value = client.LatestEventDetailId ?? 0 });
connection.Open();
using (SqlDataReader reader = await command.ExecuteReaderAsync())
{
var results = await reader.ReadAsIEnumarableAsync<ClientUsageDetail>();
_log.Debug("ClientUsageRepository.GetClientUsage: Client: {0}, results: {1}", client.Reference, results.Count());
return results;
}
}
}
但是,当Web作业正在进行调用时(有时在重新启动Web作业时),将引发以下异常并且Web作业将停止/重新启动:
System.NotSupportedException未处理 消息:Microsoft.Azure.WebJobs.Host.dll中发生未处理的“System.NotSupportedException”类型异常 附加信息:不支持的调用类型''。
在调试Web作业时本地以及在具有标准服务计划且“Always On”设置为true的站点上托管Web作业的azure上都会发生这种情况。
这是由于连续Web作业中发生的某些超时,还是传入队列消息的问题?我已经尝试重新创建队列并手动发布单个消息,但我注意到,几分钟后,Web作业响应另一条消息(我没有创建)。
非常感谢任何帮助!
不确定它是否相关,但为了完全公开,我还通过依赖注入(StructureMap)实例化了Azure表存储和Redis缓存实例,这些实例稍后将在过程中用于持久化/加载结果。