100分献上,江湖救急,急,IIS抛出参数错误。

starryiis 2012-01-15 10:31:26
在VS2008环境下,项目运行正常,但是将站点发布出来,部署在IIS6下后,却出现了参数错误。

IIS抛出参数错误,错误信息如下:

“/”应用程序中的服务器错误。
--------------------------------------------------------------------------------

长度不能小于 0。
参数名: length
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.ArgumentOutOfRangeException: 长度不能小于 0。
参数名: length

源错误:

执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。

堆栈跟踪:


[ArgumentOutOfRangeException: 长度不能小于 0。
参数名: length]
System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy) +7495111
BasePage.CheckUser() +319
BasePage.OnLoad(EventArgs e) +16
System.Web.UI.Control.LoadRecursive() +50
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627




--------------------------------------------------------------------------------
版本信息: Microsoft .NET Framework 版本:2.0.50727.3625; ASP.NET 版本:2.0.50727.3634

问题一:为什么在VS2008下项目运行正常,而发布出来,部署在IIS6下后则提示“Length参数错误”???

问题二:没有提示说明“Length参数”出现在那个文件的哪一行,只有“堆栈”信息,我该怎么排查???


急、急、急,谢谢大家。。。
...全文
397 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
chen_ya_ping 2012-01-29
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 starryplayer 的回复:]

引用 16 楼 maco_wang 的回复:
引用 9 楼 starryplayer 的回复:
长度不能小于 0。
参数名: length
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.ArgumentOutOfRangeException: 长度不能小于 0。
参数名……
[/Quote]
虚拟目录比网站多了一个名称在URL上。所以应该就是这个导致的。
starryplayer 2012-01-19
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 mcycsnd007 的回复:]
urlString.IndexOf('/') 可能在当前数据 中不存在/而导致 index为-1 即没有找到 所以会提示不能为0 反正是没找到这个'/' 从楼主后来提供的iis站点和虚拟目录来看
我的意见
1 检查当前传入的url是否存在'/' 可以断点跟踪
2 站点和虚拟目录在 路径上存在差异 虚拟目录多了1层 所以会发现站点和虚拟目录报错不报错的区别
和iis无关
比较……
[/Quote]

是的。。。
anheizhizi 2012-01-19
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 mcycsnd007 的回复:]
urlString.IndexOf('/') 可能在当前数据 中不存在/而导致 index为-1 即没有找到 所以会提示不能为0 反正是没找到这个'/' 从楼主后来提供的iis站点和虚拟目录来看
我的意见
1 检查当前传入的url是否存在'/' 可以断点跟踪
2 站点和虚拟目录在 路径上存在差异 虚拟目录多了1层 所以会发现站点和虚拟目录报错不报错的区别
和iis无关
比较……
[/Quote]

+1
格桑花 2012-01-19
  • 打赏
  • 举报
回复
调试看下urlString的值是不是正确的
qq623932737 2012-01-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 chen_ya_ping 的回复:]
这个明显就是你的程序问题啊,不是IIS的错误,
比如你的数组长度就0
你非要args[0] 这样肯定爆 System.ArgumentOutOfRangeException: 长度不能小于 0。 这个异常。
CheckUser
InternalSubStringWithChecks
看看这2个方法,数组直接索引操作的时候,请先判断数组的长度,你需要用到的索引只能是0~数组长度-1
[/Quote]
+1
mcycsnd007 2012-01-16
  • 打赏
  • 举报
回复
urlString.IndexOf('/') 可能在当前数据 中不存在/而导致 index为-1 即没有找到 所以会提示不能为0 反正是没找到这个'/' 从楼主后来提供的iis站点和虚拟目录来看
我的意见
1 检查当前传入的url是否存在'/' 可以断点跟踪
2 站点和虚拟目录在 路径上存在差异 虚拟目录多了1层 所以会发现站点和虚拟目录报错不报错的区别
和iis无关
比较推荐第2种解释 从第1种可能去排查验证第2种存在
lonenan 2012-01-16
  • 打赏
  • 举报
回复
这种问题一般是由于应用程序中的某个方法有问题,比如在传入参数时未进行数据判断而造成的
xianxiliu 2012-01-16
  • 打赏
  • 举报
回复
有可能是你VS 开发用的.net版本和IIS里面设置的不一致吧

计算机程序,什么情况都有可能发生
starryplayer 2012-01-16
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 maco_wang 的回复:]
引用 9 楼 starryplayer 的回复:
长度不能小于 0。
参数名: length
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.ArgumentOutOfRangeException: 长度不能小于 0。
参数名: length

源错误:


行 4……
[/Quote]

这个错误,在VS下不会发生,但是在IIS下则会提示错误,详细信息如下:

发布出来的站点。如果以独立的站点来运行(在IIS下新建站点),访问时则会报错。

但如果以“虚拟目录应用程序”部署(IIS6下共享Web文件夹,IIS7下添加应用程序),则正常。。。

为什么呢,新建站点和在已有站点新建虚拟目录运行程序,两者有什么不同。

不解啊,不解啊。。。
starryplayer 2012-01-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 findcaiyzh 的回复:]

应该还是程序问题估计测试的数据和live的数据不一致,导致有些问题没有测试出来。

估计是Substring调用InternalSubStringWithChecks。

设置断点跟踪一下估计Substring的参数有小于0的情况。

另外,这叫运行时错误,不叫语法错误。
[/Quote]

运行时错误,这种错误应该怎样调试啊???
宝_爸 2012-01-15
  • 打赏
  • 举报
回复
应该还是程序问题估计测试的数据和live的数据不一致,导致有些问题没有测试出来。

估计是Substring调用InternalSubStringWithChecks。

设置断点跟踪一下估计Substring的参数有小于0的情况。

另外,这叫运行时错误,不叫语法错误。
starryplayer 2012-01-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 chen_ya_ping 的回复:]

这个明显就是你的程序问题啊,不是IIS的错误,
比如你的数组长度就0
你非要args[0] 这样肯定爆 System.ArgumentOutOfRangeException: 长度不能小于 0。 这个异常。
CheckUser
InternalSubStringWithChecks
看看这2个方法,数组直接索引操作的时候,请先判断数组的长度,你需要用到的索引只能是0~数组长度-1
[/Quote]

CheckUser方法:
public void CheckUser()
{
if (Session["UserAccount"] == null)
{
Response.Redirect("~/Web/Login.aspx", true);
}
else
{
string urlString = Request.Url.ToString();
urlString = urlString.Replace("http://", "");
urlString = urlString.Substring(urlString.IndexOf('/') + 1);
//判断是否从正确的链接进来
#region ZZQ
//TODO:ZZQ 解决Open开头的文件,window.showModalDialog无法访问的问题
//if (!urlString.Substring(urlString.LastIndexOf('/') + 1).Contains("open"))
if (!urlString.Substring(urlString.LastIndexOf('/') + 1).ToLower().Contains("open"))
#endregion
{
if (Request.UrlReferrer != null)
{
//服务器运行要加上Mycems.UI/,本地运行不需要
//if (!urlString.Contains("Mycems.UI/"))
// urlString = "Mycems.UI/" + urlString;

//判断是否存在权限
if (urlString != urlString.Substring(0,urlString.IndexOf('/'))+"/Default.aspx")
{
if (urlString == urlString.Substring(0,urlString.IndexOf('/'))+"/Web/UserPopedom/Detail.aspx" || urlString.Substring(urlString.LastIndexOf('/') + 1) == "Browse.aspx")
{
UserPopedomManager upManager = new UserPopedomManager();
DataTable upTable = upManager.GetUserPopedoms("MAddress", "and UserNo='" + Session["UserNo"] + "' and s.MAddress='" + urlString.Substring(urlString.IndexOf('/')+1) + "'");
if (upTable == null || upTable.Rows.Count == 0)
Response.Redirect("~/Web/ErrorPage.aspx", true);
}
}
}
else
Response.Redirect("~/Web/ErrorPage.aspx", true);
}
}
}
这就是“CheckUser”方法,什么地方不对呢,有语法错误???

对于“InternalSubStringWithChecks”方法,整个解决方法都搜索不到。
starryplayer 2012-01-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 chen_ya_ping 的回复:]

这个明显就是你的程序问题啊,不是IIS的错误,
比如你的数组长度就0
你非要args[0] 这样肯定爆 System.ArgumentOutOfRangeException: 长度不能小于 0。 这个异常。
CheckUser
InternalSubStringWithChecks
看看这2个方法,数组直接索引操作的时候,请先判断数组的长度,你需要用到的索引只能是0~数组长度-1
[/Quote]

那么为什么在VS2008环境下正常呢???
chen_ya_ping 2012-01-15
  • 打赏
  • 举报
回复
这个明显就是你的程序问题啊,不是IIS的错误,
比如你的数组长度就0
你非要args[0] 这样肯定爆 System.ArgumentOutOfRangeException: 长度不能小于 0。 这个异常。
CheckUser
InternalSubStringWithChecks
看看这2个方法,数组直接索引操作的时候,请先判断数组的长度,你需要用到的索引只能是0~数组长度-1
jkaka2012 2012-01-15
  • 打赏
  • 举报
回复
你看下你用的是.net2.0还是3.0,08正常的的话那你应该要选择3.0.试试。
starryplayer 2012-01-15
  • 打赏
  • 举报
回复
怎样根据这里的堆栈信息进行排查???
叶子 2012-01-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 starryplayer 的回复:]
长度不能小于 0。
参数名: length
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.ArgumentOutOfRangeException: 长度不能小于 0。
参数名: length

源错误:


行 44:
行 45: //判断是否存在权限
……
[/Quote]
如果字符串中没有/ ,截取函数就会提示有错误,先判断有没有再截取即可。
阿非 2012-01-15
  • 打赏
  • 举报
回复
if (urlString != urlString.Substring(0,urlString.IndexOf('/'))+"/Default.aspx")
-----------------------------
代码写得没有健壮性

zhulong1111 2012-01-15
  • 打赏
  • 举报
回复
urlString 仔细调试。。估计刚刚好遇到位数不够的截取出错
starryplayer 2012-01-15
  • 打赏
  • 举报
回复
加上这个判断就好了。。。

if (urlString.IndexOf('/') > 0)
{
加载更多回复(4)

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧