我有以下示例页面结构:
Webpage.aspx
Script.aspx
如果我Server.Execute("Script.aspx")
从Webpage.aspx 调用,我如何在Script.aspx中检测到它是从Webpage.aspx调用而不是直接从Web浏览器调用的?
我已经尝试检查Referrer但这似乎只返回域而不是脚本.
我在.NET 3.5上使用ASP.NET Web Forms
由于Server.Execute运行与原始页面具有相同上下文的新页面,因此Request的所有属性仍应反映对Webpage.aspx的原始请求(CurrentExecutionFilePath除外,它希望包含"/Script.aspx").Request.Path应包含"/Webpage.aspx",而Request.Url将在需要查看域或查询字符串时提供完整的Uri对象.
您还可以在调用Server.Execute之前向Context.Items添加值,并在Script.aspx中读取它们
在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将始终生成当前执行的脚本,因此比较两者将得到所需的结果.
希望这可以帮助.