“长度不能小于零”,在空行上
本文关键字:不能 小于 | 更新日期: 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 循环在此处终止,不显示任何异常。