我有以下示例页面结构:
如果我从Webpage.aspx调用Server.Execute("Script.aspx")
,我如何在Script.aspx中检测到它是从Webpage.aspx调用而不是直接从Web浏览器调用的?
我已经尝试检查推荐人,但这似乎只返回域而不是脚本。
我在.NET 3.5上使用ASP.NET Web Forms
答案 0 :(得分:12)
由于Server.Execute运行与原始页面具有相同上下文的新页面,因此Request的所有属性仍应反映对Webpage.aspx的原始请求(CurrentExecutionFilePath除外,它希望包含“/Script.aspx”) 。 Request.Path应包含“/Webpage.aspx”,而Request.Url将在需要查看域或查询字符串时提供完整的Uri对象。
您还可以在调用Server.Execute之前向Context.Items添加值,并在Script.aspx中读取它们
答案 1 :(得分:6)
在Script.aspx.cs中,您只需检查Request.Path与当前执行路径的比较。
if ( Request.CurrentExecutionFilePath == Request.Path )
{
//This has been called from a web browser
} else {
//This has been executed from the file Request.Path
}
为什么呢?
当您调用Server.Execute时,请求的部分传递不受影响。因此,如果您在使用Webpage.aspx.cs中的Server.Execute后从Script.aspx.cs查看Request.Path的值,您将看到它的值为“/Webpage.aspx”。
但是,如果Web浏览器直接访问Script.aspx,则Script.aspx.cs中的Request.Path值将导致“/Script.aspx”。 currentExecutionPath将始终生成当前执行的脚本,因此比较这两个脚本将得到所需的结果。
希望这有帮助。
答案 2 :(得分:0)
至少你可以通过Request.IsLocal判断请求是否是本地请求。
答案 3 :(得分:0)
您可以将一个查询字符串参数传递给Script.aspx(这将帮助您识别它是从WebPage.aspx调用的)。
Server.Execute("script.aspx?xFrom=webPage.aspx")
编辑:我认为请求中应该有一些值,以便您知道它正在运行webpage.aspx。
EDIT2:Request.Url?
答案 4 :(得分:0)
HttpRequest.FilePath
会将URL返回到请求的页面,然后您可以为“Script.aspx”执行子字符串匹配。
(尽管我的.Net非常糟糕,但这个答案还是很大。)
答案 5 :(得分:0)
假设您没有任何IHttpHandler功能,您可以检查HttpContext.PreviousHandler是否为空。但是,由于可以设置PreviousHandler有一百万(好的,几个)原因,我会在调用Server.Execute之前使用stevemegson建议使用HttpContext.Items。