2010-04-16 9 views
3

У меня есть веб-сервис ASMX, работающий под IIS7 в классическом режиме. Эта услуга имеет следующий код:Null Reference получение 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() 

Я теряюсь здесь, так как это очень простой обычный код ванили.

EDIT

Это становится еще более странным. Я добавил некоторый базовый код, просто задающийся вопросом, какие серверные переменные я могу получить в этот момент. Это терпит неудачу с тем же исключением, когда я пытаюсь получить все ключи:

System.NullReferenceException: Object ссылка не указывает на экземпляр объекта . в System.Web.Hosting.ISAPIWorkerRequestInProc.GetAdditionalServerVar (Int32 индекса) на System.Web.Hosting.ISAPIWorkerRequestInProc.GetServerVariable (String имени) в System.Web.HttpRequest.AddServerVariableToCollection (String имени) в системы. Web.HttpRequest.FillInServerVariablesCollection() на System.Web.HttpServerVarsCollection.Populate() на System.Web.HttpServerVarsCollection.get_AllKeys() на MyService.MyHelper()

Когда я смотрю g в коде кода выглядит так, как это может произойти, когда массив, который кэширует переменные сервера, не заполняется, и похоже, что это происходит, когда имеется нулевой указатель на некоторый Контекст ... который кажется довольно основной частью кода рамки ,

Я полагаю, что пришло время сжечь один из наших билетов на поддержку с Microsoft.

ответ

1

Переход через мои старые вопросы. Я считаю, что это было вызвано ошибкой в ​​.net или IIS. По сути, веб-служба была отмечена как Oneway. Таким образом, пользователь был отключен до того, как обработчик был выполнен, поэтому, если вам не удалось получить доступ к переменным запроса до выполнения обработчика, вы столкнулись бы с исключением нулевой ссылки.

Обходной путь состоял в том, чтобы добавить HTTP-модуль, который получил доступ к свойству ранее в конвейере до того, как клиент был отправлен ответ, и обработчик был выполнен.

0

Кажется, что это не всегда заполняется в зависимости от прокси ... http://haacked.com/archive/2006/10/11/A_Gotcha_Identifying_the_Users_IP_Address.aspx

+0

Да, но это не должно приводить к исключению нулевой ссылки. Он просто вернет IP-адрес прокси, который в порядке ... Я хочу что-то не исключение – JoshBerke