2010-04-16 5 views
3

클래식 모드에서 IIS7에서 실행되는 ASMX 웹 서비스가 있습니다. 이 서비스의 코드는 다음과 같습니다.Null 참조 REMOTE_ADDR 가져 오기

try 
    { 
     env.ExternalIP = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 
    } 
    catch (Exception ex) 
    { 

     LogWriter.WriteError(ex); 
     env.ExternalIP="000.000.000.000"; 
    } 

결과로 다음과 같은 스택 추적이 발생합니다. 난 단지 무고한 사람들을 보호하기 위해 여기 usercode 호출 스택의 이름을 수정 :

Message: An Exception of type: NullReferenceException occured in method: GetAdditionalServerVar 
ExceptionMsg: Object reference not set to an instance of an object. 
===Stack Trace=== 
    at System.Web.Hosting.ISAPIWorkerRequestInProc.GetAdditionalServerVar(Int32 index) 
    at System.Web.Hosting.ISAPIWorkerRequestInProc.GetServerVariable(String name) 
    at System.Web.HttpRequest.AddServerVariableToCollection(String name) 
    at System.Web.HttpRequest.FillInServerVariablesCollection() 
    at System.Web.HttpServerVarsCollection.Populate() 
    at System.Web.HttpServerVarsCollection.Get(String name) 
    at System.Collections.Specialized.NameValueCollection.get_Item(String name) 
    at MyService.MyMethod() 

내가 여기에이 같은 손실에있어 일반 바닐라 코드 아주 기본적인 것입니다.

편집

이 심지어 낯선 가져옵니다. 나는이 시점에서 얻을 수있는 서버 변수를 궁금해하는 기본적인 코드를 추가했다.

System.NullReferenceException : 개체의 인스턴스로 설정되지 않았습니다 객체 참조 I 시도하고 모든 열쇠를 얻을 때이 같은 예외와 함께 실패합니다. 시스템에서 System.Web.HttpRequest.AddServerVariableToCollection에서 System.Web.Hosting.ISAPIWorkerRequestInProc.GetServerVariable에서 System.Web.Hosting.ISAPIWorkerRequestInProc.GetAdditionalServerVar (INT32 인덱스) (문자열 명) (문자열 이름)에서. MyService.MyHelper에서 System.Web.HttpServerVarsCollection.get_AllKeys() 에서 System.Web.HttpServerVarsCollection.Populate() 에서 Web.HttpRequest.FillInServerVariablesCollection() () 나는

을 찾는 때 g는 프레임 워크 코드에서 서버 변수를 캐싱하는 배열이 채워지지 않은 상황에서 발생할 수 있습니다. 그리고 Context에 대한 null 포인터가있을 때 발생합니다 ... 프레임 워크 코드의 핵심 부분처럼 보입니다. .

Microsoft 지원 티켓 중 하나를 태울 때가 된 것 같습니다.

답변

1

. 나는 이것이 .net 또는 IIS의 버그로 인한 것이라고 생각합니다. 본질적으로 웹 서비스는 Oneway로 표시되었습니다. 이렇게하면 핸들러가 실행되기 전에 사용자의 연결이 끊어 지므로 핸들러를 실행하기 전에 요청 변수에 액세스하지 않으면 null 참조 예외가 발생합니다.

해결 방법은 클라이언트가 응답을 보내고 처리기가 실행되기 전에 먼저 파이프 라인에서 속성에 액세스 한 HTTP 모듈을 추가하는 것입니다.

0

HttpContext.Current.Request.UserHostAddress에서 직접 ip를 시도 했습니까? 나의 오래된 질문을 통해가는 것은 그것이 항상 프록시에 따라 채워지지 않은 것으로 보인다

+0

예 위의 코드를 이끌어 냈습니다. – JoshBerke