Пустая ссылка получает REMOTE_ADDR - PullRequest
3 голосов
/ 16 апреля 2010

У меня есть веб-сервис ASMX, работающий под IIS7 в классическом режиме. Эта услуга имеет следующий код:

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

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

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

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: объект ссылка не установлена ​​на экземпляр объект. в System.Web.Hosting.ISAPIWorkerRequestInProc.GetAdditionalServerVar (Int32 индекс) в System.Web.Hosting.ISAPIWorkerRequestInProc.GetServerVariable (String имя) в System.Web.HttpRequest.AddServerVariableToCollection (String имя) в System.Web.HttpRequest.FillInServerVariablesCollection () в System.Web.HttpServerVarsCollection.Populate () в System.Web.HttpServerVarsCollection.get_AllKeys () в MyService.MyHelper ()

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

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

Ответы [ 3 ]

1 голос
/ 16 января 2013

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

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

0 голосов
/ 16 апреля 2010

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

0 голосов
/ 16 апреля 2010

Вы пытались получить IP напрямую от HttpContext.Current.Request.UserHostAddress?

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