У нас есть класс ведения журнала C #, который использует System.Diagnostics.StackTrace и StackFrame для получения информации об имени файла, белья, классе и методе, для которого был вызван logger.writeLine (), которые затем вставляются в сообщение журнала.
Мы использовали это в консольных приложениях, в службах Windows, в веб-приложениях .aspx и в веб-службах .asmx, без проблем.
Сейчас я работаю над IIS-размещенный сервис WCF, и я вижу что-то странное.
Если я добавлю logger.writeLine () в конструктор класса ServiceBehavior, и он получит следующий код:
System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace(true);
System.Diagnostics.StackFrame sf = st.GetFrame(2);
Первая строка, кажется, возвращает ноль.Или, по крайней мере, вторая создает исключение NullReferenceException.
Теперь вот странность.Это происходит только тогда, когда я размещаю веб-сервис в IIS.Когда я работаю на сервере разработки Visual Studio, у меня нет проблем.
И даже в IIS у меня проблемы только в конструкторе.Вызовы logger.writeLine () работают нормально, в методах OperatioonContract и в методах, вызываемых из них.Проблема заключается только в конструкторе и только в том случае, если он размещается в IIS.
Если я оберну попытку / поймать это в logger.writeLine (), чтобы в случае возникновения исключения мы простоне включайте информацию о строке в файл журнала, все работает отлично.Или я мог просто не использовать ведение журнала в конструкторе - единственное, что я делал в конструкторе, это протоколирование того, что конструктор был вызван.Так что на самом деле у меня нет проблем.
Но мне интересно, что происходит и в каком странном уголке .NET я наткнулся.Когда я сталкиваюсь с подобными странностями и нахожу обходные пути, которые, кажется, справляются с ними, половину времени есть какая-то другая проблема, которую я просто еще не заметил.
Итак, у кого-нибудь есть какие-либо объяснения, почему этоможет происходить?