生成空的.NET文件时出现“路径中有非法字符”错误

4
我在IIS6 web服务器上有一个完全空白的“.aspx”文件。该服务器已安装.net 3.5。
执行此文件时,会生成“路径中存在非法字符”的错误。此错误的完整堆栈跟踪可在此处找到。
通过IISReset可以暂时解决该问题。但是,一旦此服务器上的任何站点开始出现此问题,则该站点上的每个.aspx页面的每次访问都将导致相同的问题(包括我的完全空白示例文件)。
可能是什么原因导致了这个问题?如何解决? 编辑: 我已经添加了一份悬赏,希望在我们向微软提出支持案例之前能得到更多的帮助。我看到了亚当·休斯指出的知识库文章博客文章,但这些信息本身并不能提供完整的解决方案。该博客是为那些拥有我所缺乏的知识和技能的人编写的,但显然我需要学习这些内容。我需要帮助理解这里发生的一些连接和推理。

我特别寻求关于以下任何问题的帮助,只要能让我获得一个正常运行的系统:

  1. 知识库文章的解决方法在第六步中让我选择一个CGI程序可执行文件。我应该选择什么?调试过程是否应该帮我发现选择哪个程序?

  2. 博客文章谈到了一种调试方法,但它假定我拥有我尚未掌握的知识。虽然我已经推断出我需要ADPlus,但我从未使用过这个工具,也没有必要在此之前检查内存转储。当作者说:

    时间紧迫,失去的不多,我选择了实时调试的方法。由于问题此时很容易重现,因此我很快就得到了所需的内存转储。

    我如何使用ADPlus(或任何其他工具)生成内存转储,并确保内存转储包含我需要调试的信息? "adplus -crash -iis" 是否能满足我的需求?

  3. 问题发生在生产服务器上。虽然如果必须的话我可以重新启动服务器,但我需要尽可能避免造成干扰。在活动服务器上生成内存转储是安全和合理的吗?服务器的其他功能是否会受到影响,如果是,我应该注意什么?

  4. 听起来我走在正确的道路上了吗?还有哪些途径可以解决这个问题?

编辑:Vinay,这里是您请求的有关ISAPI过滤器和通配符映射的信息:

ISAPI Filters
(来源:photobooks.com)

Wildcard Mappings
(来源:photobooks.com)

.aspx文件相关联的文件的完整路径为C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll

我们在本地网络上有一个此服务器的镜像。我能够使用它来搜索所有web.config实例,但我没有发现任何异常。事实上,看起来我们从不使用web.config的这个部分,因为所有条目都与此相同:
<httpHandlers>
    <remove verb="*" path="*.asmx"/>
    <add verb="*" path="*.asmx" validate="false" type="..." />
    <add verb="*" path="*_AppService.axd" validate="false" type="..."/>
    <add verb="GET,HEAD" path="ScriptResource.axd" validate="false" type="..." />
</httpHandlers>

看起来我应该对我们目前在一些ASP Classic网站上使用的ISAPI_Rewrite3持怀疑态度。你也这么认为吗?我想知道“修复”这个问题是否意味着替换ISAPI_Rewrite3? 编辑: 我已经从ISAPI过滤器列表中删除了ASP.NET条目。完整路径是C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_filter.dll。删除后没有明显的不良影响。MSDN指出它用于帮助维护无cookie会话状态,这对于此服务器并不重要。
几个小时过去了,自从移除了ASP.NET过滤器后,问题就没有再出现了。不幸的是,我没有办法再现这个问题,除非等待它再次发生。我打算让它保持到明天晚上。如果问题再次出现,我将删除ISAPI_Rewrite3过滤器并再次尝试(值得庆幸的是,该过滤器的功能并不被我们的客户广泛使用)。无论如何,我会回来报告我的结果。
按要求检查了部分。此服务器上所有web.config文件中的所有条目都与此示例相同。
<httpModules>
    <add name="ScriptModule"
         type="System.Web.Handlers.ScriptModule,
               System.Web.Extensions,
               Version=3.5.0.0,
               Culture=neutral,
               PublicKeyToken=31BF3856AD364E35"/>
</httpModules>

感谢您的帮助!


嗯,删除这个“完全空白”的aspx文件吗? - user1228
3
所有.NET文件都发生了同样的错误,但我想排除可能存在的错误代码。这个“完全空白”的aspx文件是重现问题所需的最少量代码:也就是根本没有代码。如果我删除所有的.aspx文件,问题可能会消失,但这对我来说有点过于玄学了。 - Chris Nielsen
我更新了我的答案,加入了更多建议。 - Vinay Sajip
让我们抱最好的希望。你有机会查看最后一次IISReset之后到第一次错误发生时的任何服务器访问日志吗? - Vinay Sajip
3个回答

2
请参考KB 922780:使用.NET Framework 2编写的CGI程序进行Web服务调用时出现错误消息:“System.ArgumentException:路径中存在非法字符”,以及相关的博客文章。您的代码在调用GetCurrentDirectory时失败,就像博客文章中的代码一样。

这篇KB文章很有趣,但我卡在第6步了:我应该在那里选择什么CGI程序?这篇博客文章听起来和我的问题类似,但是它超出了我的理解范围。我该如何生成内存转储,如何确保它包含我需要的信息,这是我想在生产服务器上做的事情吗? - Chris Nielsen

2
我不确定你是否需要立即使用ADPlus,因为他所发现的问题,你已经知道了——最有可能的罪魁祸首是改变当前目录的某个东西。
关键点似乎是IISReset可以暂时解决问题,但是在服务器上的某个站点发生某些事情后,问题会重新出现。这里的“站点”是指ASP.NET应用程序,请确认是否不是这种情况。
多个站点都出现问题表明,问题很可能是ISAPI过滤器或扩展,或一个映射到一个或多个特定ASP.NET应用程序的通配符映射的.EXE文件。
因此,打开IIS管理器,并在ISAPI过滤器和通配符映射方面提供信息。ISAPI过滤器信息将显示在Web站点的属性对话框的“ISAPI过滤器”选项卡中(在IIS管理器的树视图下的“Web站点”下)。通配符映射将在“应用程序配置”对话框中,您可以从ASP.NET应用程序的属性对话框中的“配置...”按钮调用该对话框。
除了通配符映射之外,还要查看针对.aspx扩展名注册的确切映射,并在更新中报告它们。
问题也可能存在于单独的ASP.NET网站中安装的HttpHandlers中,因此请查看Web.config中的<httphandler>部分,以查看是否定义了处理程序,例如:
<add verb="*" path="*.aspx" type="..." />

这可能是在您所使用的应用程序之外的应用程序上出现的问题。要查看是否可以跟踪下是哪个应用程序,请在执行IISReset后检查服务器日志,以查看返回5xx HTTP状态代码(表示内部服务器错误)的第一条记录,并查看触发它的请求。处理该请求的应用程序可能是需要关注的应用程序。
所有我建议的事情都应该在生产服务器上安全执行 :-) 我并不建议您真正执行IISReset,只需在您执行的最后一个IISReset之后立即检查日志即可。
更新:我看到了您发布的更新信息。可能是ISAPI_Rewrite3引起的问题,也可能不是;我之前已经使用过它而没有任何问题。但是,我很惊讶在ISAPI筛选器列表中看到了ASP.NET_2.0.xxx - 我的列表中没有它(我正在运行Windows Server 2003)。因此,当时间允许时(您可能需要安排停机时间),暂时将这两个ISAPI筛选器从列表中删除(以便您可以轻松地恢复它们),然后查看是否有差异。如果似乎变得更糟,那么将ASP.NET筛选器添加回去(该条目的确切路径是什么?),并留下ISAPI_Rewrite3进行再次尝试。
我对在ISAPI筛选器列表中看到ASP.NET DLL感到惊讶的原因是,通常使用每个应用程序基础上的映射来配置它(其中应用程序继承默认配置)。它通常作为ISAPI扩展而工作,而不是ISAPI过滤器。
您还可以请检查部分,我们与同样的方式检查吗?
有必要再次运行aspnet_regiis,它会为IIS初始化ASP.NET系统;但是这是重大步骤,可能会破坏很多东西。如果可能,请将整个服务器复制到单独的测试或开发网络上的备用计算机上并在那里执行。您能否对此类测试使用本地镜像?

谢谢您的帮助!我已经收集了所需的信息并更新了我的问题。 - Chris Nielsen
谢谢您再次帮助;我已经更新了我的问题并提供了更多信息。 - Chris Nielsen
到目前为止,一切看起来都很好。如果问题再次出现,你给了我一些很好的线索可以继续跟进。非常感谢你的帮助! - Chris Nielsen

0
在 Global.asax 文件中添加以下代码:
private static string EnvironmentDir = null; 
void Application_Start(object sender, EventArgs e)
{
     EnvironmentDir = System.Environment.CurrentDirectory;
}

void Application_BeginRequest(object sender, EventArgs e)
{
      System.Environment.CurrentDirectory = EnvironmentDir;
}

谢谢您的建议!然而,问题已经得到解决:按照Vinay Sajip的建议,从ISAPI过滤器列表中删除了ASP.NET条目后,问题一个月内没有再次出现。虽然如此,我还是很感激您的帮助! - Chris Nielsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接