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 を使用しようとしています。ベースの代わりに。何も解決しませんでした。