数组:“索引在数组边界之外”

本文关键字:数组 边界 索引 | 更新日期: 2023-09-27 18:33:41

我在 Web 应用程序上收到以下错误:"索引超出了数组的范围。

奇怪的是,问题只出现在我的网络服务器上(Windows Server 2008 R2,.Net 4.0,Windows 7 Enterprise 64位)。

当我在Visual Studio中调试网站时,一切都很完美

代码如下所示:

我定义了一个数组并将其提供给类"用户查核权限"

string NTLogin = Page.User.Identity.Name.ToString().Split(new char[] { '''' })[1].ToUpper();
string[] allowedRoles = new string[2] { "Administrator", "Superuser" };
CheckUserRights Check = new CheckUserRights(NTLogin, allowedRoles);

该类如下所示:

//Lokale Variablen definieren
string strUserName;
string strRolename;
string[] AllowedRoles;
bool boolAuthorized;
//Im Konstruktor definierte Werte übergeben.
public CheckUserRights(string Username, string[] Roles)
{
    this.strUserName = Username;
    this.AllowedRoles = Roles;
    getRoleForUser();
    checkRights();
}
...
...

我在 4 小时后搜索了解决方案,但找不到任何东西。我不是专业人士,这是我第一次使用数组。

可能是服务器上的错误配置吗?

我感谢每一个帮助。谢谢!

更新

解决了,服务器配置中存在问题。解决方案就在史蒂夫的回答中。

数组:“索引在数组边界之外”

该代码中存在许多问题,但是,坚持问题标题上的问题,我认为这一行看起来很可疑:

string NTLogin = Page.User.Identity.Name.ToString().Split(new char[] { '''' })[1].ToUpper();  

如果 Page.User.Identity.Name 不包含域''用户名,会发生什么情况?

可以改写为

string[] nameparts = Page.User.Identity.Name.ToString().Split(new char[] { '''' });
string NTLogin = (nameparts.Length == 2 ? nameparts[1] : nameparts[0]).ToUpper();
if(NTLogin.Length == 0)
    return;            

为什么此属性可能是错误?看看这篇文章

1)你的代码容易受到getRoleForUser中第一个选择的SQL注入攻击。 您应该使用 SqlParameter。

2) 如果没有堆栈跟踪,则很难确定错误的位置。 但是,我认为sql选择可能不返回行。 因此,每当您执行r.Read时,请将其更改为 if (!r.Read()) return;

同样,如果您发布堆栈跟踪,我们可以提供更好的帮助。

我是如何解决的,如下所示:

Dim strname() As String
For indx = 0 To (strname.Length - 1)
    If strname(indx) = "" Then
    Else
        ListBox1.Items.Add(strname(indx))
    End If
Next