Asp.net Request.Url.Segments[3]无法使用IIS 7

Asp.net Request.Url.Segments[3]无法使用IIS 7,asp.net,iis,Asp.net,Iis,Request.Url.Segments[3]返回pagename。在我的演示服务器上安装了IIS6,工作正常,但在我的实时服务器上安装了IIS7和Request.Url.Segments[3]没有返回页面名称,它给出了一个错误 请帮帮我。提前感谢这与IIS版本无关。最有可能的是,您的站点设置不同 例如,在dev上,默认情况下,在Visual Studio F5调试上,站点在以下位置运行: http://localhost:1234/sitename/folder/page.aspx

Request.Url.Segments[3]
返回pagename。在我的演示服务器上安装了
IIS6
,工作正常,但在我的实时服务器上安装了
IIS7
Request.Url.Segments[3]
没有返回页面名称,它给出了一个错误


请帮帮我。提前感谢

这与IIS版本无关。最有可能的是,您的站点设置不同

例如,在dev上,默认情况下,在Visual Studio F5调试上,站点在以下位置运行:

http://localhost:1234/sitename/folder/page.aspx
                     |\_______/\_____/\_______/
                     0    1       2       3 
在测试/生产中,您可能没有第一个文件夹:

http://sitename.corpo.com/folder/page.aspx
                         |\_____/\_______/
                         0   1      2    
有更好的方法动态获取数组的最后一个元素,即使不知道其长度。尝试使用:

Request.Url.Segments.Last()
或者,没有linq

Request.Url.Segments[Request.Url.Segments.Length - 1]

如果您不是在寻找最后一个元素,则可能必须找到更好的方法来指定所需内容。

这与IIS的版本无关。最有可能的是,您的站点设置不同

例如,在dev上,默认情况下,在Visual Studio F5调试上,站点在以下位置运行:

http://localhost:1234/sitename/folder/page.aspx
                     |\_______/\_____/\_______/
                     0    1       2       3 
在测试/生产中,您可能没有第一个文件夹:

http://sitename.corpo.com/folder/page.aspx
                         |\_____/\_______/
                         0   1      2    
有更好的方法动态获取数组的最后一个元素,即使不知道其长度。尝试使用:

Request.Url.Segments.Last()
或者,没有linq

Request.Url.Segments[Request.Url.Segments.Length - 1]

如果您没有查找最后一个元素,则可能必须找到一种更好的方法来指定所需内容。

中每个项目的值在
.Segments
中完全取决于Url,Url由IIS中的站点设置方式决定

例如,让您的站点位于Web服务器的根目录下,将为站点位于虚拟根目录下提供不同的结果

在url中,页面位于项目索引1处。 在url中,页面位于项目索引2处

您可以通过以下方式证明这一点:

var uri = new Uri("http://myserver/mypage.aspx");
for (var i = 0; i < uri.Segments.Length; i++)
{
    Console.WriteLine("Segments[{0}]: {1}",i,  uri.Segments[i]);
}
现在再试一次

var uri2 = new Uri("http://myserver/myvirtualroot/mypage.aspx");
这次您将获得:

Segments[0]: /
Segments[1]: myvirtualroot/
Segments[2]: mypage.aspx
关键是,除非您知道实际的站点url(以及它在IIS中的配置)在不同的环境中是相同的,否则您不能可靠地说“条目索引3就是页面”。(即便如此,这也不是一种特别好的方法,因为它对变化的脆弱性)


正如Kobi所指出的,只需使用uri.Segments.Last()即可获得您想要的最后一个片段(如果有查询字符串,则不带查询字符串)。

中每个项目的值
.Segments
完全取决于Url,Url由IIS中站点的设置方式决定

例如,让您的站点位于Web服务器的根目录下,将为站点位于虚拟根目录下提供不同的结果

在url中,页面位于项目索引1处。 在url中,页面位于项目索引2处

您可以通过以下方式证明这一点:

var uri = new Uri("http://myserver/mypage.aspx");
for (var i = 0; i < uri.Segments.Length; i++)
{
    Console.WriteLine("Segments[{0}]: {1}",i,  uri.Segments[i]);
}
现在再试一次

var uri2 = new Uri("http://myserver/myvirtualroot/mypage.aspx");
这次您将获得:

Segments[0]: /
Segments[1]: myvirtualroot/
Segments[2]: mypage.aspx
关键是,除非您知道实际的站点url(以及它在IIS中的配置)在不同的环境中是相同的,否则您不能可靠地说“条目索引3就是页面”。(即便如此,这也不是一种特别好的方法,因为它对变化的脆弱性)


正如Kobi所指出的,简单地使用uri.Segments.Last()将获得您想要的最后一个片段(如果有查询字符串,则不使用查询字符串)。

有点过火了-
Segments
数组将不包括任何查询,您不必搜索它。这正是
Uri
类如此有用的原因——它成功地处理了真实的Uri。请参阅位于Your's right的示例-根本不需要提供扩展方法。我从.PathAndQuery开始,做了一个拆分,这确实需要这个。然后我切换到.Segments,没有重新运行代码。我的错-谢谢你的关注-我会编辑。有点太过分了-无论哪种方式,
数组都不会包含查询,你不必搜索它。这正是
Uri
类如此有用的原因——它成功地处理了真实的Uri。请参阅位于Your's right的示例-根本不需要提供扩展方法。我从.PathAndQuery开始,做了一个拆分,这确实需要这个。然后我切换到.Segments,没有重新运行代码。我的坏消息-谢谢你的点播-我会编辑的。