Проблема с методом обратного вызова и поддержкой CultureInfo и ASP.Net HttpRuntime

Вот моя проблема. Я работаю над решением для электронной коммерции, которое развернуто в нескольких европейских странах. Мы сохраняем все исключения в приложении для SQL Server, и я обнаружил, что в БД есть записи с датой и временем в будущем!

Мы определяем культуру в файле web.config, например, pt-PT, а ожидаемый формат — ДД-ММ-ГГГГ.

После отладки я обнаружил, что проблема с этими «будущими» записями в БД связана с используемыми нами методами обратного вызова. Например, в нашей архитектуре кэширования мы используем обратные вызовы как таковые:

CacheItemRemovedCallback ReloadCallBack = new CacheItemRemovedCallback(OnRefreshRequest);

Когда я проверяю текущие потоки CultureInfo, в этих обратных вызовах это en-US вместо pt-PT, а также HttpContext имеет значение null. Если при обратном вызове возникает исключение, наш диспетчер исключений сообщает об этом как MM-DD-YYYY и, таким образом, оно неправильно сохраняется в SQL Server.

К сожалению, в коде диспетчера исключений мы используем DateTime.Now, что нормально, если это не обратный вызов. Я не могу изменить этот код, чтобы он соответствовал культуре, поскольку он используется в других вертикалях.

Итак, почему обратные вызовы в ASP.Net не поддерживают контекст? Есть ли способ сохранить его в этом потоке обратного вызова? Каковы лучшие практики здесь?

Спасибо.


person Little Larry Sellers    schedule 01.07.2009    source источник


Ответы (2)


DateTime.Now не зависит от региональных параметров. Вы сохраняете его как строку? ToString действительно зависит от региональных параметров.

На самом деле, как правило, старайтесь хранить вещи в базе данных так, чтобы это не зависело от культуры. Это особенно важно в веб-приложении, где культура для каждого запроса может отличаться от следующего. Чтобы иметь возможность «сравнивать яблоки с яблоками», нужно игнорировать культуру.

person John Saunders    schedule 01.07.2009
comment
Да, это ToString. Я согласен с тем, что культуру следует игнорировать для хранения в базе данных, но это устаревший код, с которым мне приходится иметь дело. Проблема в том, что обратный вызов теряет контекст ASP.Net и культуру приложения. Это то, что я хочу попытаться как-то решить. - person Little Larry Sellers; 01.07.2009
comment
Я не знаю, происходит ли этот обратный вызов в контексте того же запроса. Если это так, вы можете сохранить культуру в HttpContext.Current.Items[CultureForRequest] и извлечь ее в обратном вызове. - person John Saunders; 01.07.2009

Вы должны отделить DateTime (рекомендуется UTC) от остальной части описания ошибки в управлении ведением журнала, а также сохранить культуру, связанную с записью журнала. Затем вы можете собрать информацию с этими 3 частями независимо друг от друга.

Обратный вызов кеша поступает в поток пула потоков, который в вашем случае всегда имеет en-US и нет HttpContext. Вы должны иметь возможность получить культуру, связав удаленный элемент кеша с логикой обратного вызова.

person user134706    schedule 28.07.2009