【问题标题】:ASP Classic: request function for url param not working?ASP Classic:url 参数的请求功能不起作用?
【发布时间】:2014-10-02 16:21:42
【问题描述】:

我通常不处理我们网站的旧 ASP 页面。我没有更改这些页面中的任何代码。但是突然之间,所有带有request("param") 的页面都无法正确加载。

这基本上是它的结构。我所有的页面都包含一些其他的 .asp 文件。在他们每个人的最后我写了response.write("test")之类的东西,以确保页面的执行正在执行并且确实如此。然后在我尝试访问的页面上,我尝试在所有包含 response.write("test") 之后的第一行,这会显示测试消息。不过,如果我在此之前添加声明 request("param") BIM!没有显示测试消息。

我不知道它可能是什么,甚至不知道如何调试它。你有什么建议吗?

同样,我没有更改任何 ASP 代码,它工作正常。我唯一能想到的是我在服务器上添加了一个新网站,并创建了一个与该新网站的绑定。但是我没有对之前的ASP页面所在的网站添加任何绑定。不知道有没有关系。这也只发生在我们的测试服务器上。生产网站运行良好。

编辑:我注意到一个服务器错误说 The Template Persistent Cache initialization failed for Application Pool 'local.website1.com' because of the following error: Could not create a Disk Cache Sub-directory for the Application Pool. The data may have additional error codes. 这可能是相关的吗?

编辑:我只是尝试将request("param") 更改为Request.QueryString("param"),这很有效,但我不想编辑我拥有request 的每一页。这是怎么回事……

编辑:我尝试过的另一件事。我清空了我的页面,现在只有

<% 
  request("param")
  response.write("test")
%>

我从前一页上的链接访问该页。通过链接进入我的页面,我不会显示测试消息。但是,如果我返回浏览器中的 url 并按 Enter 键(直接访问页面,而不是链接),它将显示“测试”。我应该调查前一页吗?是否与参数传递相关联?

编辑:又做了一件事。 在我的页面 A pagea.aspx 中,我有指向 myasppage.asp?param=value 的链接,我创建了两个链接。一个是asp:linkbutton,我在后面设置了postBackUrl = myasppage.asp?param=value;。另一个链接是asp:hyperlink,我在其中设置了navigateUrl = myasppage.asp?param=value;。来自超链接控件的链接有效。来自 linkBut​​ton 的链接不起作用。

【问题讨论】:

  • 你在新网站上真的启用了经典asp吗? IIS7及以上默认不开启?
  • @John 我的意思是在服务器上创建并添加了一个新网站。但在这里,我试图访问第一个网站上的 ASP 页面,该网站已经有功能性的 ASP 页面
  • 只是为了澄清经典的 asp 已启用并且工作属性,您的问题是您想使用速记 request("param") 与 request.querystring("") 或 request.form("") ???
  • @Frank 代码一直使用request,仅此而已。这也是它在产品服务器上的工作方式。我相信经典的 ASP 是启用的,因为我有时可以看到诸如 &lt;% response,write("test")%> 之类的东西
  • 您的问题并没有说明您正在尝试访问由 ASP.Net 页面发送的Request("param")。如果您在这一点上更清楚,您可能会节省很多人的时间。

标签: asp.net forms asp-classic request


【解决方案1】:

Classic ASP 的应用程序池需要在 Classic 模式下运行,而不是在集成模式下运行。如果新网站当前使用与 website1 网站相同的应用程序池,请为新网站创建一个新应用程序池。

我通过搜索“Classic ASP 中的请求表单停止工作”或类似的东西来记忆。

我很抱歉没有早点想到这一点。至少我之前的回答是调试的一个很好的教训。我希望你不需要太多的 Rograine 来恢复脱发。

【讨论】:

  • 是真的吗?它似乎工作。但只是几个问题。该网站有aspx和asp页面。它会以某种方式影响aspx页面吗?知道为什么这个设置发生了变化,导致 ASP 页面关闭了吗?
  • 同样在 prod 服务器上,asp 页面运行良好,应用程序池设置为集成。有什么理由吗?
  • 好问题。我工作的网站在经典模式下使用应用程序池运行 .Net 3.5 和经典 ASP,没有问题。这里有一些链接,对 stackoverflow.com/questions/716049/…hanselman.com/blog/… 的区别进行了很好的解释
  • 以集成模式响应 Prod 服务器。经典 ASP 是在虚拟目录中还是作为单独的应用程序?否则,是否有适用于 Classic ASP 的自定义 HttpHandler?
  • 据我所知,源代码所在的框是与其他人/网站共享的。所以我认为它是一个虚拟驱动器。对于 httphandler,web.config 没有任何 httphandler 提及 asp。我应该去别的地方吗?
【解决方案2】:

如果您想使用简写 request("param") 与长格式 request.querystring("param") 或 request.form("param") ,那么您需要记住这一点速记方法不仅在编码方面马虎,而且还会导致像您遇到的问题。

我不确定事情的确切顺序。但我认为 request("param") 将首先检索查询字符串参数,然后是表单,然后是 cookie。 (我可能对那个顺序有误)。这是因为在编程方面不好说您正在使用 request("fname") 而不是 request.form("fname") 从提交的表单中获取数据。但是url是form.asp?timestamp=234234。 ASP 将跟踪查询字符串参数,并且“fname”将为空,因为它不存在于查询字符串中。 ASP 不够聪明,无法在所有三个(表单、查询字符串、cookies)对象中寻找参数。

要么清理你的代码到 request.form / request.querystring。或者进一步调查以确保不适合您的网址中没有隐藏的查询字符串。如果您启用了 IIS 重写规则,它甚至可能会显示一个查询字符串,该规则会为您提供漂亮的 URL。

试试这段代码来调查哪些变量在起作用:

<%
      Response.Write ("<b>All form Variables</b><br>")
       For Each Item In Request.Form
        xName = Item
        xValue = Request.Form(Item)
        Response.Write("Name: " & xName & " | Value: " & xValue & "<BR>" )     
       Next 

       Response.Write ("<BR><b>All QuersyString Vars</b><br>")
       For Each Item In Request.Querystring
        xName = Item
        xValue = Request.Querystring(Item)
        Response.Write("Name: " & xName & " | Value: " & xValue & "<BR>" ) 
       Next 

 %>

如果上面的代码最终为您提供了 Form 和 Querystring 变量(在相关页面上),那么您知道您遇到了 ASP 不知道您正在使用什么对象的问题。

【讨论】:

  • 感谢您的回答,弗兰克。在那种情况下,为什么这段代码仍在生产服务器上运行?我也在这里使用非常简单的代码。我从一个 aspx 页面开始,到一个 asp 页面结束,url 中有一个参数和两行代码。 response.write(request("nUser")) response.write("greg&lt;br&gt;")我在页面中没有看到任何隐藏字段。如何进一步调查 url 的隐藏字段?
  • 首先,创建一个名为 test.asp 的文件。 如果可行,那么您知道将本地计算机配置为运行经典 asp 不是问题(默认情况下未启用经典 asp)。如果这有效,那么您可能会遇到一个问题,即 ASP 不知道您是要请求表单还是请求查询字符串,因为您没有告诉它是哪一个。所以 ASP 是在为你猜测并且猜测是错误的。调查此问题的最简单方法是添加一段代码来写出所有 Request.Form 和 Request.Querystring 参数。
  • 查看我的示例代码,了解可以在哪里列出所有表单/查询字符串变量。
  • 我用一个简单的&lt;% response.write("testing asp") %&gt; 尝试了 test.asp,效果很好。我还尝试了脚本循环来编写 Request.Form 中的所有项目,但似乎 Request.From 也停止了页面的执行。一个简单的request.Form("param") 然后response.write("test") 在我的测试页面上工作,但在我尝试从aspx asp:linkbutton 控件访问的页面上不起作用......
【解决方案3】:

评论的文字太多了,所以我会发布它作为答案。我希望你不介意再做一次测试。 Frank 建议启用详细错误 (enable detailed errors in IIS)。如果您还没有这样做,请这样做。在您的问题的早期,您声明以下代码失败。

<% 
  request("param")
  response.write("test")
%>

请将以下调试行添加到测试中

<% 
  on error resume next 
  request("param")
  response.write "<br />Error number " & Err.number
  response.write "<br />Error description" & Err.Description
%>

希望这将为我们提供有关问题所在的更多详细信息。我怀疑您对调查发现的错误是正确的。我发现了一些关于该问题的帖子,您可能想查看这些帖子。

这两个站点引用了这个站点:Template Persistent Cache initialization failed for Application Pool" on IIS 7 using Classic ASP

【讨论】:

  • 谢谢。我启用了详细错误并尝试了该脚本。我的页面保持空白...我尝试request("param"); 只是为了查看它并显示Microsoft VBScript compilation error '800a0401' Expected end of statement。与此同时,我早先按照您提供的链接解决了服务器错误。但仍然。
  • 我们正在取得进展!编译错误是分号。我的错误是第一行。请将其更改为on error resume next 另外,请确认修复服务器错误后重新启动了IIS。
  • 我的错,我把脚本粘贴错了。两条指令在同一行。它实际上是所有空白页面的结果。不会引发错误。掉头发...
  • 那么,响应仍然停止请求参数?老鼠!尝试注释掉请求行(注释是撇号)。错误号应该是没有描述的 0。顺便说一句,掉头发总比变白好。
  • 还有一件事要检查。应用程序池是在经典还是集成管道模式下运行?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-23
  • 2018-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
相关资源
最近更新 更多