. NET Core 2.2 time.ToString ("d", культура) Исключение - PullRequest
1 голос
/ 10 января 2020

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

Ответы [ 2 ]

0 голосов
/ 21 января 2020

Я решил эту проблему, обновив решение до. NET Функции Core 3.1 и Azure до V3 с. NET Core 2.2 и Функции V2. После обновления я больше не встречал эту ошибку, поэтому я думаю, что это был эфир. NET Core 2.2 или Azure ошибка функции V2.

0 голосов
/ 16 января 2020

Согласно сообщению об ошибке, мы можем найти строку:

at System.DateTimeFormat.Format(DateTime dateTime, String format, IFormatProvider provider)

Но «DateTimeFormat» просто существует в «System.Globalization.CultureInfo» в. net 2.2 .

И еще одна строка в вашем сообщении об ошибке:

at System.Globalization.CultureInfo.get_DateTimeFormat() at System.DateTimeFormat.Format(DateTime dateTime, String format, IFormatProvider provider, TimeSpan offset)

Так что я думаю, что это может вызвать сообщение об ошибке, эти два "DateTimeFormat" не совпадают.

Поскольку я не могу видеть весь ваш код и функции, поэтому я могу просто предоставить эту информацию, которая, как я подозреваю, может послужить причиной для вашей ссылки. Пожалуйста, проверьте ваш код и обратите внимание на «DateTimeFormat» в вашем коде (возможно, когда вы получаете заказ от sql, я думаю, «DateTimeFormat» был «System.DateTimeFormat», когда вы получаете его от sql, и когда Вы новый "CultureInfo", если можете просто использовать "System.Globalization.CultureInfo.DateTimeFormat" в. net 2.2).

...