2012-02-07 127 views
7

我捕获了一些访问我网站特定部分的用户的信息,并且出现奇怪的错误。我有一段代码执行以下操作。HttpRequestBase.UserHostAddress抛出错误

string userIp = request.UserHostAddress; 

请求变量是一个HttpRequestBase。有时候这种方式工作的很好,我得到了IP--其他时候它会抛出一个错误,我不知道如何防范。这是来自我的错误日志。

“值没有在预期范围之内。在System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(的Int32的errorCode,IntPtr的errorInfo中) 在System.Web.Hosting.IIS7WorkerRequest.GetServerVariableInternal(字符串名称)”

看来,我第一次去它的网页工作得很好,如果我进行刷新,就会抛出错误,或者快速进入捕获相同变量的另一个页面。

+0

看看这是否可以帮助你:http://stackoverflow.com/questions/650357/httprequest-servervariables-throws-argumentexception-in-wcf-with-iis7 – 2012-02-07 16:13:35

+0

我发布之前,我读了一个。这不适用于此。我没有将合同设置为OneWay。 – Mitch 2012-02-07 16:45:28

+0

你可以尝试'System.Web.HttpContext.Current.Request.UserHostAddress' - 只是为了防止HttpRequestBase不会像HttpRequest – 2012-02-07 18:27:30

回答

6

我有我的记录器这个确切的问题。我正在使用依赖注入,因为我怀疑你是。

在我的情况,我得到这个错误,因为我没有绑定我的记录器到请求范围。所以,它在两个请求之间生存,并且保留了一些HttpContext属性,但是在与IIS交谈时抛出异常。

由于我使用的是Ninject,因此只需将名称空间Ninject.Web.Common中的InRequestScope()方法添加到我的绑定中即可。

总之:这个例外似乎是抛出的HttpContext陈旧实例时,某些属性,被整理到IIS和该请求不再有效,被访问。

希望有帮助!

p.s. NLog比您要编写的任何记录器都要好。或者,如果你只是想要例外,那就放入ELMAH。

+1

我从一个有点不同的情况得到了这个错误。在ASMX webservice中,我做了一些后期工作,可能长期运行,而且我想在不减慢主要操作的情况下完成工作。所以我用'Task.Factory.StartNew'运行它。由于完成工作需要一些访问HttpContext,我愚蠢地从启动任务的lambda中设置HttpContext.Current。当它尝试访问ServerVariables时发生崩溃。 – 2013-12-31 18:50:47