私のアプリケーションは、Windows Server 2012 R2に展開されたASP.NET MVC Webサイトです。私は組み込みのWindowsライブラリURLMoniker - urlmon.dllを使用して、ファイルのMIMEタイプを取得しています。ファイルパスをGetMimeTypeメソッドに渡しています。問題は私が直面しているのは、Visual Studioを使用してデバッグすると、そのファイルのMIMEタイプを返します(テストケースでは、txtファイルの場合、 "application/octet-stream"を返します)。しかし、運用サーバーにデプロイした後、アプリケーションプールが予期せずクラッシュし、ログファイルにログがありません。追加のログエントリの助けを借りて、このコードブロックに入るまでに3日かかりました。MIMEタイプチェック中にURLMoniker urlmon.dllでアプリケーションプールがクラッシュする
private string GetMimeType(string filePath)
{
log.Info("Getting mime type for " + filePath);
byte[] buffer = new byte[256];
using (FileStream fs = new FileStream(filePath, FileMode.Open))
{
if (fs.Length >= 256)
fs.Read(buffer, 0, 256);
else
fs.Read(buffer, 0, (int)fs.Length);
}
log.Info("Done reading into byte array for " + filePath);
try
{
System.UInt32 mimetype;
FindMimeFromData(0, null, buffer, 256, null, 0, out mimetype, 0);
System.IntPtr mimeTypePtr = new IntPtr(mimetype);
string mime = Marshal.PtrToStringUni(mimeTypePtr);
Marshal.FreeCoTaskMem(mimeTypePtr);
log.Info("Got mime type for " + filePath + " " + mime);
return mime;
}
catch (Exception e)
{
log.Error("Cannot get mime type for file " + filePath, e);
return "unknown/unknown";
}
}
でもイベントビューアは、この除き、アプリケーションプールのクラッシュのためにいかなる理由が表示されない:アプリケーションプール「SampleApp」を提供しているプロセスは、Windowsプロセスアクティブ化サービスとの致命的な通信エラーを検出しました。プロセスIDは 'yyyy'です。
詳細な調査を行った後、解決策を提供する可能性のある記事を掲載していますが、この問題の原因を特定できません。
ここにこの1つはまた、同様の問題に直面した:https://superuser.com/questions/568806/iis-worker-process-crashing-without-stack-trace-what-else-can-i-try
それはurlmon.dllとは、システムに登録されない可能性がありますが、私は、Windowsのレジストリにチェックして、それが登録されていると言います。実際にはライブラリが最新版であり、本番サーバーでレジストリの変更を適用する前に根本的な原因を見つける必要があります。 DLLを新しいバージョンに置き換えると、レジストリの問題を修正するのが私の最後の手段です。 https://answers.microsoft.com/en-us/ie/forum/ie8-windows_7/urlmondll-causing-many-programs-to-crash/cda9a6cb-cf51-499c-8855-45c97110eafe
こんにちは、ありがとうございます。あなたが持っている提案は役に立ちましたが、根本的な原因は64ビットビルドで出てきました。 FindMimeFromDataは32ビットでしか動作しませんでした。私はそれが投げたエラーのタイプについて後ほど詳しく説明します。今のところ、ロジックをProcessクラスの助けを借りて私のWebアプリケーションから呼び出されている32ビットexeユーティリティに移しました。それが私がそれを解決した方法です。手伝ってくれてありがとう。 –