Странность с классами StackTrace и WCF - PullRequest
3 голосов
/ 01 ноября 2011

У нас есть класс ведения журнала 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 я наткнулся.Когда я сталкиваюсь с подобными странностями и нахожу обходные пути, которые, кажется, справляются с ними, половину времени есть какая-то другая проблема, которую я просто еще не заметил.

Итак, у кого-нибудь есть какие-либо объяснения, почему этоможет происходить?

1 Ответ

3 голосов
/ 01 ноября 2011

При работе под IIS у вас нет привилегий для проверки кода вне (выше в стеке) ваших собственных сборок.

В любом случае, вы можете легко сделать ваш код условным, посмотрев на st.FrameCount.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...