asp.net “长度不能小于零,”

2cmtqfgy  于 2022-11-19  发布在  .NET
关注(0)|答案(5)|浏览(135)

我不断收到上面的错误信息,即使我注解掉了发生错误的行。知道是什么原因导致的吗?我试着用测试值重写这些行,但还是收到同样的错误。
这在调试模式下工作得很好,只有在部署中才会出现这种情况。
原始代码:

Line 21:             string domain, username;
Line 22:             string text = Page.User.Identity.Name;
Line 23: 
Line 24:             domain = text.Substring(0, text.IndexOf("\\"));
Line 25:             username = text.Substring(text.IndexOf("\\") + 1, text.Length - text.IndexOf("\\") - 1);

Source File: F:\<file path>\Default.aspx.cs    Line: 23

测试代码(相同错误):

Line 21:             string domain, username;
Line 22:             //string text = "TEST"; // Page.User.Identity.Name;
Line 23:             // this line is blank
Line 24:             domain = "TEST"; //text.Substring(0, text.IndexOf("\\"));
Line 25:             username = "TEST"; // text.Substring(text.IndexOf("\\") + 1,

Source File: F:\<file path>\Default.aspx.cs    Line: 23

下面是堆栈跟踪(如果有帮助的话):

[ArgumentOutOfRangeException: Length cannot be less than zero.
Parameter name: length]
System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy) +12681546
Insufficiencies._Default.Page_Load(Object sender, EventArgs e) in F:\<file path>\Default.aspx.cs:23
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +25
System.Web.UI.Control.LoadRecursive() +71
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3048
ttcibm8c

ttcibm8c1#

如果在字符串中找不到“\”,text.IndexOf("\\")将返回-1
您正在将-1传递给Substring()方法,这是无效的。
如果站点运行时没有在IIS中为该站点独占启用Windows集成身份验证,则Page.User.Identity.Name将返回空字符串。
用户可能会在匿名身份验证下访问站点。
http://msdn.microsoft.com/en-us/library/ff647405.aspx开始:
配置Windows身份验证

  • 启动Internet信息服务(IIS)。
  • 以鼠标器右击按一下应用程序的虚拟目录,然后按一下[属性]。
  • 单击“目录安全性”选项卡。
  • 在匿名访问和身份验证控制下,单击编辑。
  • 确保未选中“匿名访问”复选框,并且只选中了“集成Windows身份验证”复选框。
  • 在应用程序的Web.config文件或计算机级别的Web.config文件中,确保身份验证模式设置为Windows,如下所示。
<system.web>
 ...
   <authentication mode="Windows"/>
 ...
 </system.web>
3pmvbmvn

3pmvbmvn2#

变量text不包含\\子字符串,因此text.IndexOf("\\")返回-1,这实际上是Substring的无效参数。
要解决此问题,可以使用这样的代码,即在找不到反斜杠时分配整个text

int backSlashIndex = text.IndexOf("\\");
domain = (backSlashIndex >= 0) ? text.Substring(0, backSlashIndex) : text;
ippsafx7

ippsafx73#

text.IndexOf("\\")

如果找不到字符的索引,则会传回-1,而且从字符0取得长度为-1的子字串会掷回该错误。
www.example.com c#的另一个警告ASP.net是子字符串的length参数也不能大于实际字符串(经典ASP允许您这样做)。
试试看:

int SlashPos = text.IndexOf("\\");
if(SlashPos > 0)
    domain = text.Substring(0, SlashPos);
else
    domain = text;
hfsqlsce

hfsqlsce4#

您正在将一个小于零的数字传递到Substring调用中。我怀疑您将字符串初始化为“TEST”的示例是否存在同样的问题...

jv4diomz

jv4diomz5#

请查看下面的代码片段:

string newString = "10,20,...";
            index1 = 0;
            string fragment = " ";
           
            while (newString.Contains(",") == true)
            {
                index1 = newString.IndexOf(",");
                fragment = newString.Substring(0, index1);
                MessageBox.Show("fragment:" + fragment);
                newString = newString.Substring(index1 + 1);
                MessageBox.Show("newString:" + newString);
            }

我们可以使用“string.Contains”函数向字符串中添加一个标签。添加标签也可以通过代码来完成。输出:
“片段:10新字符串:20,....片段:20;新字符串:....”
while循环在这里终止,没有显示任何异常。

相关问题