2017-05-13 14 views
1

私のアプリケーションは、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://www.experts-exchange.com/questions/24821266/Marshal-FreeCoTaskMem-crashing-application-in-x64-but-not-x86.html

  2. ここにこの1つはまた、同様の問題に直面した:https://superuser.com/questions/568806/iis-worker-process-crashing-without-stack-trace-what-else-can-i-try

  3. それは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

  4. https://social.technet.microsoft.com/Forums/windows/en-US/c3f1517b-a8c5-422e-9317-2f539715badc/ie11-x64-on-win7-crash-ntdlldll-urlmondll?forum=w7itprohardware

答えて

1

あなたの問題は、 "FindMimeFromData" メソッドの宣言です! それはどこでうまく動作し、iisプロセスが何らかの原因でクラッシュする原因になります。

[DllImport("urlmon.dll", CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = false)]static extern int FindMimeFromData(IntPtr pBC, 
[MarshalAs(UnmanagedType.LPWStr)] string pwzUrl, 
[MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.I1, SizeParamIndex=3)] 
byte[] pBuffer, 
int cbSize, 
[MarshalAs(UnmanagedType.LPWStr)] string pwzMimeProposed, 
int dwMimeFlags, 
out IntPtr ppwzMimeOut, 
int dwReserved); 

もこの関数を呼び出すためにいくつかの変更を行う必要があります。あなたのように「FindMimeFromData」の宣言を変更する必要がありhttps://stackoverflow.com/a/18554243/4257500 :を見てみましょう。たとえば、

IntPtr mimeTypePtr; 
FindMimeFromData(IntPtr.Zero, null,file, 256, null, 0,out mimeTypePtr, 0); 
var mime = Marshal.PtrToStringUni(mimeTypePtr); 
+0

こんにちは、ありがとうございます。あなたが持っている提案は役に立ちましたが、根本的な原因は64ビットビルドで出てきました。 FindMimeFromDataは32ビットでしか動作しませんでした。私はそれが投げたエラーのタイプについて後ほど詳しく説明します。今のところ、ロジックをProcessクラスの助けを借りて私のWebアプリケーションから呼び出されている32ビットexeユーティリティに移しました。それが私がそれを解決した方法です。手伝ってくれてありがとう。 –

関連する問題