我在经典模式下运行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的空指针...这看起来像一个公平的框架代码的核心部分。
我想是时候把我们的一张支持票据烧掉了。
答案 0 :(得分:1)
回顾我的旧问题。我相信这是由.net或IIS中的错误引起的。从本质上讲,Web服务被标记为Oneway。通过执行此操作,用户在执行处理程序之前已断开连接,因此除非您在处理程序执行之前设法访问Request变量,否则将遇到空引用异常。
解决方法是添加一个HTTP模块,该模块在客户端发送响应并执行处理程序之前访问管道中的属性。
答案 1 :(得分:0)
您是否尝试过直接从HttpContext.Current.Request.UserHostAddress
获取IP?
答案 2 :(得分:0)