“长度不能小于零”,在空行上

本文关键字:不能 小于 | 更新日期: 2023-09-27 17:49:58

>即使我注释掉发生错误的行,我也不断收到上述错误消息。 知道是什么原因造成的吗? 我尝试使用测试值重写行,但仍然遇到相同的错误。

这在调试模式下完美运行,只有在部署中才出现这种情况。

原始代码:

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

“长度不能小于零”,在空行上

如果text.IndexOf("''")在字符串中找不到"''",它将返回-1

您正在将-1传递到 Substring() 方法,该方法无效。

如果站点未在 IIS 中为该站点启用 Windows 集成身份验证的情况下运行,则该Page.User.Identity.Name将返回空字符串。

用户可能会在匿名身份验证下访问该站点。

从 http://msdn.microsoft.com/en-us/library/ff647405.aspx:

配置 Windows 身份验证

  • 启动互联网信息服务 (IIS(。
  • 右键单击应用程序的虚拟目录,然后单击"属性"。
  • 单击目录安全性选项卡。
  • 在"匿名访问和身份验证控制"下,单击"编辑"。
  • 确保未选中"匿名访问"复选框,并且"集成 Windows 身份验证"是唯一选中的复选框。
  • 在应用程序的 Web.config
  • 文件或计算机级 Web.config 文件中,确保将身份验证模式设置为 Windows,如下所示。
<system.web>
 ...
   <authentication mode="Windows"/>
 ...
 </system.web>

变量text不包含''子字符串,因此text.IndexOf("''")返回-1,这确实是Substring的无效参数。

要解决此问题,您可以使用这样的代码,当找不到反斜杠时,它将分配整个text

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

如果未找到字符的索引,这将返回 -1,并且从长度为 -1 的字符0中获取子字符串将引发该错误。

ASP.net c# 的另一个警告是,子字符串的长度参数也不能大于实际字符串(经典 ASP 允许执行此操作(。

试试这个:

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

您将小于零的数字传递到Substring调用中。 我怀疑您将字符串初始化为"TEST"的示例有同样的问题......

请查看下面的代码片段:

            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);
            }

我们可以使用"字符串。包含"函数,并向字符串添加标签。标签的添加也可以通过代码完成。输出:

"片段:10新字符串:20,....片段: 20;新字符串:....">

while 循环在此处终止,不显示任何异常。