空引用获取REMOTE_ADDR

时间:2010-04-16 17:38:12

标签: asp.net iis-7

我在经典模式下运行IIS7下的ASMX Web服务。此服务具有以下代码:

   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() 

我在这里不知所措,因为这是非常基本的普通香草代码。

修改

这甚至更奇怪。我已经添加了一些基本代码,只是想知道此时我可以获得哪些服务器变量。当我尝试获取所有密钥时,这会失败并出现相同的异常:

  

System.NullReferenceException:Object   引用未设置为的实例   宾语。在   System.Web.Hosting.ISAPIWorkerRequestInProc.GetAdditionalServerVar(的Int32   指数)   System.Web.Hosting.ISAPIWorkerRequestInProc.GetServerVariable(字符串   姓名)at   System.Web.HttpRequest.AddServerVariableToCollection(字符串   姓名)at   System.Web.HttpRequest.FillInServerVariablesCollection()   在   System.Web.HttpServerVarsCollection.Populate()   在   System.Web.HttpServerVarsCollection.get_AllKeys()   在MyService.MyHelper()

当我查看框架代码时,看起来这可能发生在缓存服务器变量的数组没有填充时,看起来这种情况发生在有一个指向某个Context的空指针...这看起来像一个公平的框架代码的核心部分。

我想是时候把我们的一张支持票据烧掉了。

3 个答案:

答案 0 :(得分:1)

回顾我的旧问题。我相信这是由.net或IIS中的错误引起的。从本质上讲,Web服务被标记为Oneway。通过执行此操作,用户在执行处理程序之前已断开连接,因此除非您在处理程序执行之前设法访问Request变量,否则将遇到空引用异常。

解决方法是添加一个HTTP模块,该模块在客户端发送响应并执行处理程序之前访问管道中的属性。

答案 1 :(得分:0)

您是否尝试过直接从HttpContext.Current.Request.UserHostAddress获取IP?

答案 2 :(得分:0)