У меня очень странная ситуация, mydatetime.ToString ("d", culture) иногда выдает исключения.
Это простая Azure Премиум-функция V2, работающая в Azure on. Net Core 2.2. Это триггер в очереди хранения. Этот триггер обрабатывает ~ 2,5 миллиона раз в месяц. Иногда ToString выбрасывает «Внешний компонент выдал исключение»;
try {
var culture = new System.Globalization.CultureInfo(order.Address.Country.CultureCode);
var date = order.CreatedDate;
var test = date.ToString("d", culture); //This throws exceptions.
} catch (Exception exception) {
await StaticLoggers.HandleExceptionAsync(new BaseServices.Models.ExceptionModel {
Environment = "CustomException",
Message = $ "{order.CreatedDate.MyToDateString()} {order.Address.Country.CultureCode} " + exception.Message.MyToStringTrim(),
StackTrace = exception.StackTrace.MyToStringTrim()
});
return null;
}
Из журналов исключения полностью случайны, иногда есть день без ошибок, иногда ~ 1000. Что я заметил, так это то, что он генерирует больше во время высоких пиковых значений, поэтому я думаю, что это как-то связано с параллельным выполнением в Azure. Кроме того, дата и культура меняются, когда появляются исключения, поэтому я также подозреваю, что это не является причиной ошибки. Это сообщение, которое я регистрирую, когда ToString выдает исключение.
2020/01/10 01:10:24 de-DE External component has thrown an exception.
Дата никогда не равна нулю, и реальные культуры всегда присутствуют. Если я прокомментирую строку ToString, ошибки не возникнут.
Трассировка стека:
at Interop.Kernel32.EnumCalendarInfoExEx(EnumCalendarInfoProcExEx pCalInfoEnumProcExEx, String lpLocaleName, UInt32 Calendar, String lpReserved, UInt32 CalType, Void* lParam)
at System.Globalization.CalendarData.GetCalendars(String localeName, Boolean useUserOverride, CalendarId[] calendars) at System.Globalization.CultureData.get_CalendarIds()
at System.Globalization.DateTimeFormatInfo.set_Calendar(Calendar value)
at System.Globalization.CultureInfo.get_DateTimeFormat() at System.DateTimeFormat.Format(DateTime dateTime, String format, IFormatProvider provider, TimeSpan offset)
at System.DateTimeFormat.Format(DateTime dateTime, String format, IFormatProvider provider)
at Automation.ProcessOrderEvent.EventService.EventWorkflowService.GetOrderAsync(Int32 orderId) in C:\...\EventService\OrderUpdated.cs:line 328
Обновление 1: вышеприведенное сообщение об ошибке - трассировка полного стека, ничего не было удалено или отредактировано за исключением физического пути по соображениям безопасности. Это базовая панель верхнего уровня.
using BusinessLogicLayer.Services;
using BusinessLogicLayer.Services.Interfaces;
[assembly: WebJobsStartup(typeof(Startup))]
namespace Automation.ProcessOrderEvent
{
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddMemoryCache();
builder.Services.AddScoped<IOrderService, OrderService>();
}
}
public class ProcessOrderEvent
{
private readonly IOrderService _orderService;
public ProcessOrderEvent(IOrderService orderService) => _orderService = orderService;
[FunctionName("ProcessAwesomeEvent")]
public async Task Run([QueueTrigger("eventqueue", Connection = "AzureWebJobsStorage")] string myQueueItem, ExecutionContext context, ILogger logger)
{
await _orderService.ProcessOrderUpdate(myQueueItem);
}
}
}
Это код службы заказов:
public partial class EventWorkflowService
{
public async Task ProcessOrderUpdate(orderId)
{
var order = await GetOrderAsync(orderId);
if (order == null)
return;
var date = order.CreatedDate.ToString("d", new CultureInfo(order.Address.Country.CultureCode));
//rest of the code
}
}
GetOrder - это простой запрос System.Data.SqlClient, который получает данные. и привязывает их к заказу модели.