生成“路径中的非法字符”错误的空白.net文件

时间:2009-08-28 17:10:54

标签: .net debugging iis

我有一个完全空白的“.aspx”文件驻留在IIS6 Web服务器上。服务器安装了.net 3.5。

执行时,此文件会生成“路径中的非法字符”错误。此错误的完整堆栈跟踪为available here

IISReset可以暂时解决问题。但是,一旦此服务器上的任何站点开始出现此问题,该站点上每个.aspx页面的每次点击都会导致同样的问题(包括我完全空白的示例文件)。

可能导致此问题的原因,我该如何解决?

编辑:在我们向微软提供支持案例之前,我已经添加了一笔赏金,以期获得更多帮助。我看过Adam Hughes指出的knowledge base articleblog post,但这些信息本身并不能提供完整的解决方案。这篇博客是为那些我缺乏知识和技能的人写的,但显然我需要接受。我需要帮助理解这里发生的一些联系和推理。

我正在寻找任何这些问题的帮助,无论哪种问题都会引导我进入一个正常运行的系统:

  1. 知识库文章的解决方法让我在第六步中选择了一个可执行的CGI程序。我应该在这里选择什么?博客中描述的调试过程是否应该让我发现要为此选择哪个程序?

  2. 博客文章讨论了一种调试方法,但它假设我知道我还没有(还)。虽然我已经推断出我需要ADPlus,但我从未使用过这个工具,或者以前需要检查内存转储。当作者这样说时,我不知道该怎么做:

      

    随着时间的推移而不是很多   我输了现场调试   做法。通过这种方式,谢谢   问题很容易重现   这一次,我很快得到了所需   内存转储。

    如何使用ADPlus(或任何其他工具)生成内存转储,以及如何确保内存转储包含调试此内容所需的信息? “adplus -crash -iis”会做我想要的吗?

  3. 问题出现在生产服务器上。虽然我可以重新启动此服务器,但如果可能的话,我需要避免破坏性。在实时服务器上生成内存转储是否安全合理?服务器的其他功能是否会受此影响,如果是,我应该注意什么?

  4. 听起来我是在正确的轨道上吗?我应该考虑采取哪些其他途径来解决这个问题?

  5. 编辑: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>
    

    考虑到这一点,我似乎应该怀疑ISAPI_Rewrite3,我们目前正在使用它来支持某些ASP Classic网站上的“友好”网址。这也是你的诊断吗?我是否正确地认为“修复”此问题将意味着替换ISAPI_Rewrite3?

    编辑:我已从ISAPI筛选器列表中删除了ASP.NET条目。完整路径是C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_filter.dll。删除它没有明显的不良影响。 MSDN states用于帮助维护无Cookie会话状态,这对于此服务器来说并不重要。

    现在已经有几个小时了,自从删除ASP.NET过滤器后问题再也没有出现过了。不幸的是,我没有办法重现问题,除了等待它再次发生。我要把它放到明天晚上。如果问题再次出现,我也会删除ISAPI_Rewrite3过滤器并再试一次(幸运的是,我们的客户端并未广泛使用此过滤器的功能)。无论哪种方式,我都会回来报告我的结果。

    我检查了&lt; httpModules&gt;部分要求。此服务器上所有web.config文件中的所有此类条目与此示例相同:

    <httpModules>
        <add name="ScriptModule"
             type="System.Web.Handlers.ScriptModule,
                   System.Web.Extensions,
                   Version=3.5.0.0,
                   Culture=neutral,
                   PublicKeyToken=31BF3856AD364E35"/>
    </httpModules>
    

    感谢您的协助!

3 个答案:

答案 0 :(得分:2)

请参阅KB 922780:使用.NET Framework 2编写的CGI程序进行Web服务调用时出现错误消息:“System.ArgumentException:path in Illegal characters”

以及相关的blog post。在调用GetCurrentDirectory期间,您的代码失败了,就像博客文章中的那样。

答案 1 :(得分:2)

我不确定你是否需要接触ADPlus - 他发现使用ADPlus,你已经知道 - 最可能的罪魁祸首是改变当前目录。

一个关键点似乎是IISReset在一段时间内解决了这个问题,但问题是在某个点之后,只要服务器上的某个站点上发生某些就会出现问题。通过“站点”,我假设您的意思是ASP.NET应用程序 - 请确认此是否的情况。

多个站点出现问题的行为表明问题可能是ISAPI筛选器或扩展,或者.EXE文件映射到一个或多个特定ASP.NET应用程序上的通配符映射。

因此,启动IIS管理器,并使用有关ISAPI筛选器和通配符映射的信息更新您的问题。 ISAPI筛选器信息将位于网站的“属性”对话框的“ISAPI筛选器”选项卡中(在IIS管理器的树视图中的“网站”下)。通配符映射将位于“应用程序配置”对话框中,您可以从特定ASP.NET应用程序的“属性”对话框中的“配置...”按钮调用该对话框。

除了通配符映射外,还可以准确查看针对.aspx扩展名注册的映射,并在更新中报告这些映射。

问题还可能在HttpHandlers安装在各个ASP.NET网站中 - 所以请查看<httphandler>中的Web.config部分,看看处理程序是否定义为< / p>

<add verb="*" path="*.aspx" type="..." />

这可能是在您正在使用的应用程序之外的应用程序上。要查看是否可以跟踪哪一个,请在IISReset之后检查服务器日志,以查看哪个是返回5xx HTTP状态代码的第一个条目(指示内部服务器错误)并查看触发它的请求。处理它的应用程序可能是关注的应用程序。

我建议的所有内容在生产服务器上应该是安全的:-)我不是建议您实际执行IISReset,只需在最后一个之后立即检查日志。

更新:我看过你发布的最新信息。它可能是ISAPI_Rewrite3或不是;我以前使用它没有任何问题。但是,我很惊讶地看到ISAPI筛选器列表中的ASP.NET_2.0.xxx - 我没有它(我正在运行Windows Server 2003)。因此,我会(在时间允许的情况下 - 您可能需要安排中断)暂时从列表中删除这两个ISAPI筛选器(以这种方式可以轻松地再次恢复它们)并查看是否会产生影响。如果它似乎变得更糟,重新添加ASP.NET过滤器(该条目的确切路径是什么?)并省略ISAPI_Rewrite3,然后再试一次。

我很惊讶在ISAPI筛选器列表中看到一个ASP.NET DLL,它通常是在每个应用程序的基础上使用映射配置的(应用程序继承默认配置)。它通常用作ISAPI 扩展,而不是ISAPI 过滤器

您还可以查看<httpmodules>部分,方法与<httphandlers>相同吗?

可能需要再次运行aspnet_regiis,它为IIS初始化ASP.NET系统;然而,这是迈出的一大步可能会破坏很多东西。如果可能,将整个服务器复制到单独的测试或开发网络上的备用计算机,并在那里进行。您可以使用本地镜像进行此类测试吗?

答案 2 :(得分: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;
}