2012-02-07 2 views
7

Я занимаюсь поиском некоторой информации о пользователях, которые посещают определенный раздел моего сайта, и я получаю странную ошибку. У меня есть раздел кода, который делает следующее.HttpRequestBase.UserHostAddress throwing error

string userIp = request.UserHostAddress; 

Переменная запроса - это HttpRequestBase. Время от времени это работает очень хорошо, и я получаю IP - в других случаях он вызывает ошибку, и я не уверен, как ее защищать. Это из моего журнала ошибок.

"Значение не попадает в ожидаемый диапазон. В System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal (Int32 ERRORCODE, IntPtr errorInfo) в System.Web.Hosting.IIS7WorkerRequest.GetServerVariableInternal (имя String)"

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

+0

Посмотрите, поможет ли это вам: http://stackoverflow.com/questions/650357/httprequest-servervariables-throws-argumentexception-in-wcf-with-iis7 –

+0

Я прочитал это до того, как я опубликовал. Это не применимо здесь. Я не устанавливаю контракт на OneWay. – Mitch

+0

вы можете попробовать «System.Web.HttpContext.Current.Request.UserHostAddress» - на всякий случай, если HttpRequestBase не выполняет те же шаги, что и HttpRequest –

ответ

6

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

В моем случае я получал эту ошибку, потому что я не привязывал свой регистратор к области запроса. Таким образом, он жил между запросами и поддерживал некоторые свойства HttpContext, но бросал исключения на тех, кто разговаривал с IIS.

Поскольку я использую Ninject, это просто вопрос добавления метода InRequestScope(), из пространства имен Ninject.Web.Common, в мое привязку.

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

Надеюсь, что это поможет!

p.s. NLog лучше, чем любой регистратор, который вы напишете. Или, если вы просто хотите исключений, зайдите в ELMAH.

+1

Я получил эту ошибку из несколько иной ситуации. В веб-сервисе ASMX у меня были некоторые отделочные работы, возможно, долгое время, и я хотел сделать это, не замедляя основную операцию. Поэтому я запустил его с помощью 'Task.Factory.StartNew'. Поскольку для отделочных работ требовался некоторый доступ к HttpContext, я глупо настраивал HttpContext.Current из лямбды, которая запустила Задачу. Сбой при попытке доступа к ServerVariables. –