2011-11-01 2 views
3

우리는 System.Diagnostics.StackTrace 및 StackFrame을 사용하여 logger.writeLine()이 호출 된 파일 이름, 줄 번호, 클래스 및 메서드에 대한 정보를 얻는 C# 로깅 클래스를 사용합니다. 로그 메시지에 삽입됩니다.StackTrace 및 WCF 클래스의 기이함

우리는 콘솔 응용 프로그램, Windows 서비스, .aspx 웹 응용 프로그램 및 .asmx 웹 서비스에서이 문제를 문제없이 사용했습니다.

저는 현재 IIS가 호스팅하는 WCF 서비스에서 일하고 있습니다. 나는 이상한 것을보고 있습니다.

나는 인 ServiceBehavior 클래스의 생성자에 logger.writeLine()를 넣으면

하고이 코드에 들어간 :

System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace(true); 
System.Diagnostics.StackFrame sf = st.GetFrame(2); 

첫 번째 줄은 null을 반환 것으로 보인다. 또는 적어도 두 번째 NullReferenceException throw합니다.

이제 이상한 점이 있습니다. 이것은 IIS에서 webservice를 호스팅 할 때만 발생합니다. Visual Studio의 dev 서버에서 실행할 때 문제가 없습니다.

심지어 IIS에서도 생성자에만 문제가 있습니다. logger.writeLine()에 대한 호출은 OperatioonContract 메소드와 호출 된 메소드에서 올바르게 작동합니다. 그것은 단지 생성자에서, 그리고 IIS에 의해 호스팅 될 때만 문제가 있다는 것입니다.

logger.writeLine()에서 try/catch를 래핑하면 예외가 발생하면 로그 파일에 회선 정보가 포함되지 않으므로 모든 것이 정상적으로 작동합니다. 또는 생성자에서 로깅을 사용할 수 없습니다. 생성자에서 수행 한 유일한 작업은 생성자가 호출되었음을 기록하는 것입니다. 그래서 저는 실제로 문제가 없습니다.

그러나 나는 무슨 일이 일어나고 있는지 궁금하고 .NET의 이상한 구석을 발견했습니다. 이런 기이 한 일들을 처리하고 그들을 다루는 것으로 보이는 해결책을 찾았을 때, 아직 절반은 다른 문제가 있습니다.

그럼 왜 이런 일이 일어날 지에 대한 설명이있는 사람이 있습니까?

+0

_what_?의 생성자는? 응용 프로그램 개체? –

+0

ServiceBehavior 클래스의 생성자입니다. –

답변

3

IIS에서 실행할 때 자신의 어셈블리 외부 (스택 위)의 코드를 검사 할 수있는 권한이 없습니다.

어쨌든 st.FrameCount을 보면 코드를 조건부로 쉽게 만들 수 있습니다.

+0

ahh가 henk에 맞았습니다. 그리고 이것은 바른 대답입니다 –

+0

그것은 합리적인 대답처럼 들립니다. 왜 st.GetFrame (2)이 항상 내 어셈블리 안에있는 것은 아닌지 분명하지 않습니다. ServiceBehavior 생성자는 Logger.writeLine(), Logger.writeLine()을 호출하고 Logger.getFileinfo()를 호출하며 Logger.getFileinfo()는 StackTrace()를 호출합니다. 따라서 GetFrame (0)은 Logger.getFileinfo()이어야하고 GetFrame (1)은 Logger.writeLine()이어야하며 GetFrame (2)는 항상 내 어셈블리에 있어야하는 ServiceBehavior 생성자 여야합니다. –

+0

잘 모르겠다. 그러나 이것들이 _to_ 메소드 호출이라고 생각한다. 따라서 Frame (2)는 호스팅에서 ctor 호출이다. 나는 hoster 규칙이 적용된다고 생각한다. –