1

我们的 IIS 定期崩溃,我们通过正在调查的 DebugDiag 进行了崩溃转储。

异常代码始终是 e053534f,我认为这是堆栈溢出,因此一直在查看堆栈跟踪以找到某种无限循环。出现两种不同的堆栈跟踪:

System.Web.VirtualPath.Create(System.String, System.Web.VirtualPathOptions)
System.Web.VirtualPathUtility.ToAppRelative(System.String)
Company.AssemblyResourceProvider.IsAppResourcePath(System.String)
Company.AssemblyResourceProvider.GetCacheDependency(System.String, System.Collections.IEnumerable, System.DateTime)
System.Web.Hosting.VirtualPathProvider.GetCacheDependency(System.String, System.Collections.IEnumerable, System.DateTime)
Company.AssemblyResourceProvider.GetCacheDependency(System.String, System.Collections.IEnumerable, System.DateTime)
System.Web.Hosting.VirtualPathProvider.GetCacheDependency(System.String, System.Collections.IEnumerable, System.DateTime)

System.Web.Hosting.MapPathBasedVirtualPathProvider.GetFile(System.String)
Company.AssemblyResourceProvider.GetFile(System.String)
Company.AssemblyResourceProvider.GetFile(System.String)
Company.AssemblyResourceProvider.GetFile(System.String)

AssemblyResourceProvider 的代码如下所示。

public class AssemblyResourceProvider : System.Web.Hosting.VirtualPathProvider  
{
    public AssemblyResourceProvider() {}
    private bool IsAppResourcePath(string virtualPath)
    {
        String checkPath =
           VirtualPathUtility.ToAppRelative(virtualPath);
        return checkPath.StartsWith("~/App_Resource/", StringComparison.InvariantCultureIgnoreCase);
    }
    public override bool FileExists(string virtualPath)
    {
        return (IsAppResourcePath(virtualPath) || base.FileExists(virtualPath));
    }
    public override VirtualFile GetFile(string virtualPath)
    {
        if (IsAppResourcePath(virtualPath))
            return new AssemblyResourceVirtualFile(virtualPath);                
        else
            return base.GetFile(virtualPath);
    }
    public override System.Web.Caching.CacheDependency GetCacheDependency(string virtualPath, System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart)
    {
        if (IsAppResourcePath(virtualPath))
            return null;
        else 
            return base.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
    }
}

我无法在任何开发设置上重现该错误,所以这就是我必须继续的。

我自己的理论是我应该更换底座。与上一个。但是从 MS 中查看 VirtualPathProvider 的代码,它似乎只是包装了对 Previous 的调用。由于无法在本地复制,我只能做出改变,推动生活,看看会发生什么。

我希望这里有人能够解释为什么会发生循环。

更新 1

有另一个崩溃和转储文件,其中记录了堆栈跟踪的第三个变体:

System.Web.Hosting.MapPathBasedVirtualPathProvider.GetFile(System.String)
Company.AssemblyResourceProvider.GetFile(System.String)
System.Web.VirtualPathUtility.ToAppRelative(System.String)
Company.AssemblyResourceProvider.GetFile(System.String)
System.Web.VirtualPathUtility.ToAppRelative(System.String)
Company.AssemblyResourceProvider.GetFile(System.String)
System.Web.VirtualPathUtility.ToAppRelative(System.String)

更新 2

尝试使用上一个。而不是基地。没有解决任何问题。

4

0 回答 0