Я создаю веб-сервис ASP.NET, который будет использоваться внутри моей компании. Регистрация исключений и трассировки / аудита будет выполняться классом веб-службы, а также бизнес-объектами, которые будет вызывать веб-служба. Ведение журнала обрабатывается экземпляром класса внутренней поддержки журнала. Помощник журнала должен быть экземпляром, так как он отслеживает состояние, и справочным гидом, который используется для связи сообщений журнала в группы.
Раньше мы обрабатывали эту ситуацию, передавая ссылки на экземпляр помощника журнала из класса в класс, используя параметры метода. Я пытаюсь найти надежный способ найти способ хранения и доступа к экземпляру в течение всего вызова без необходимости явной его передачи.
Я пытаюсь сохранить экземпляр в HTTPContext на ранних этапах вызова веб-службы. Когда это понадобится моим бизнес-объектам позднее во время вызова, они получат к нему доступ как к свойству базового класса, от которого наследуются все мои объекты.
Сначала я попытался сохранить экземпляр в Context.Cache веб-службы. Похоже, это сработало, и мои исследования привели меня к мысли, что кэш будет безопасным для потоков. Только после того, как я начал вызывать веб-сервис из более чем 3 одновременных сессий, экземпляр регистратора будет совместно использоваться от вызова к вызову, а не будет заново создаваться новым для каждого вызова. Я попробовал Context.Application и нашел очень похожие результаты с хранилищем Cache.
Мне удалось найти то, что выглядит как полезное решение с Context.Session. Это требует, чтобы я использовал EnableSession = true в атрибутах каждого метода, но он, кажется, сохраняет экземпляр уникальным для каждого вызова. У меня нет необходимости отслеживать данные между вызовами, поэтому я не храню сеансовые куки в клиентском пространстве.
Является ли сессия оптимальной точкой хранения для моих нужд? Это кажется немного тяжелым, учитывая, что мне не нужно отслеживать сеанс между вызовами. Я открыт для предложений или критики. Я уверен, что кто-то посоветует использовать встроенную систему трассировки или системы вроде Elmah. Это может быть вариантом на будущее, но сейчас у меня нет времени, необходимого, чтобы пойти по этому пути.
Обновление: я должен уточнить, что эта служба должна будет работать на .Net Framework 2.0. Мы находимся в процессе перехода на 3.5 / 4.0, но наш текущий рабочий сервер - Win2000 с максимальным значением 2.0.