1

IIS が定期的にクラッシュしており、調査中の DebugDiag でクラッシュ ダンプを作成しました。

例外コードは常に e053534f であり、これはスタック オーバーフローであると思われるため、スタック トレースを調べてある種の無限ループを見つけました。2 つの異なるスタック トレースが発生します。

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

スタック トレースの 3 番目のバリアントを記録した別のクラッシュおよびダンプ ファイルがありました。

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

Previous を使用しようとしています。ベースの代わりに。何も解決しませんでした。

4

0 に答える 0