【问题标题】:Client IP address in ASP.NET (.asmx) webservicesASP.NET (.asmx) Web 服务中的客户端 IP 地址
【发布时间】:2010-03-28 19:47:21
【问题描述】:

我正在使用带有 Silverlight 的 ASP.NET (.asmx) Web 服务。由于无法在 Silverlight 中找到客户端 IP 地址,因此我不得不在服务端记录此内容。 以下是我尝试过的一些方法:

Request.ServerVariables("REMOTE_HOST")
HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]
HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
Request.UserHostAddress()
Request.UserHostName()
string strHostName = Dns.GetHostName();
string clientIPAddress = Dns.GetHostAddresses(strHostName).GetValue(0).ToString();

上述所有方法在我的本地系统上都可以正常工作,但是当我在生产服务器上发布我的服务时,它开始报错,

错误:对象引用未设置为对象的实例。堆栈跟踪:

在 System.Web.Hosting.ISAPIWorkerRequestInProc.GetAdditionalServerVar(Int32 索引)

在 System.Web.Hosting.ISAPIWorkerRequestInProc.GetServerVariable(字符串名称)

在 System.Web.Hosting.ISAPIWorkerRequest.GetRemoteAddress()

在 System.Web.HttpRequest.get_UserHostAddress()

【问题讨论】:

    标签: asp.net web-services asmx


    【解决方案1】:

    您应该尝试找出NullReferenceException 的确切来源。更改您的代码以了解某些事物可以返回 null。例如,在

    HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]
    

    HttpContext.Current 可以返回 null,或者 .Request 可以返回 null,或者 .ServerVariables["REMOTE_ADDR"] 可以返回 null。另外,在

    string clientIPAddress = System.Net.Dns.GetHostAddresses(strHostName).GetValue(0).ToString();
    

    GetHostAddresses(strHostName) 可以返回 null,或者.GetValue(0) 可以返回 null。

    如果方法或属性可以返回 null,那么您应该在取消引用之前检查 null。例如,

    IPAddress[] hostAddresses = System.Net.Dns.GetHostAddresses(strHostName);
    string clientIPAddress;
    if (hostAddresses != null)
    {
        object value = hostAddresses.GetValue(0);
        if (value != null)
        {
            clientIPAddress = value.ToString();
        }
    }
    

    附:我不知道你为什么要使用GetValue(0)。请改用hostAddresses[0]

    【讨论】:

    • 当我尝试 Request.UserHostAddress 或 HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"] 时发生空引用异常我只是找不到任何方法在我的 asmx 服务中获取客户端 IP。 =(
    • @Zain:就像我说的,在使用这些值之前检查 null。事实上,在尝试 HttpContext.Current.Request 之前,请务必先测试 HttpContext.Current 以查看它是否为空。
    【解决方案2】:

    如果您在 System.Web.Hosting.ISAPIWorkerRequestInProc.GetAdditionalServerVar 代码中使用 Reflector 看看,我们会看到:

    private string GetAdditionalServerVar(int index)
    {
        if (this._additionalServerVars == null)
        {
            this.GetAdditionalServerVariables();
        }
        return this._additionalServerVars[index - 12];
    }
    

    我看到这可能引发 NullReferenceException 的两个原因:

    1) _additionalServerVars 成员存在多线程问题。我认为这不会发生,因为 A) 我不明白为什么在测试期间您的服务器上会有很大的负载,并且 B) ISAPIWorkerRequestInProc 实例可能与线程相关联。

    2) 您的服务器不是最新的,生产中的代码与我在机器上看到的不同。

    所以我要做的是检查服务器,确保它是最新的 .NET Framework dll。

    【讨论】:

      猜你喜欢
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      • 1970-01-01
      • 2017-01-17
      • 2013-06-29
      • 1970-01-01
      相关资源
      最近更新 更多