2017-05-13 12 views
1

Mon application est le site Web ASP.NET MVC déployé sur Windows Server 2012 R2. J'utilise la bibliothèque Windows intégrée URLMoniker - urlmon.dll pour obtenir le type MIME d'un fichier. Je passe son chemin de fichier à la méthode GetMimeType. Le problème auquel je suis confronté est, quand je le débogue en utilisant Visual Studio, il renvoie le type mime de ce fichier (dans mon cas de test, pour un fichier txt, il renvoie "application/octet-stream"). Mais après le déploiement sur le serveur de production, le pool d'applications se bloque de manière inattendue et il n'y a pas de journaux dans le fichier journal, il m'a fallu 3 jours pour descendre à ce bloc de code (avec des entrées de journal supplémentaires).Le pool d'applications se bloque avec URLMoniker urlmon.dll lors de la vérification du type MIME

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"; 
     } 
    } 

Même l'observateur d'événements ne montre aucune raison de l'accident de la piscine app sauf ceci: Un pool d'applications au service de processus "SampleApp" a subi une erreur de communication fatale avec Windows Process Service d'activation. L'identifiant du processus est 'aaaa'. Après avoir fait des recherches détaillées autant que j'ai pu trouver, j'ai des articles suivants qui pourraient fournir une solution, mais je ne trouve toujours pas la cause exacte de ce problème.

  1. https://www.experts-exchange.com/questions/24821266/Marshal-FreeCoTaskMem-crashing-application-in-x64-but-not-x86.html

  2. Celui-là aussi face problème similaire: https://superuser.com/questions/568806/iis-worker-process-crashing-without-stack-trace-what-else-can-i-try

  3. Il dit urlmon.dll pourrait ne pas être enregistrés sur le système mais j'ai vérifié dans le registre Windows et il est enregistré. En fait, cette bibliothèque est la plus récente et j'ai besoin de trouver la cause première avant d'appliquer des changements de registre sur le serveur de production. Remplacer dll avec une nouvelle version, la résolution des problèmes de registre est mon dernier recours. 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

Répondre

1

Votre problème est la déclaration de la méthode "FindMimeFromData"! cela fonctionne bien et où le processus d'iis se bloque ailleurs. Jetez un oeil à: https://stackoverflow.com/a/18554243/4257500 Vous devez changer la déclaration de « FindMimeFromData » comme:

[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); 

et vous devriez faire quelques changements pour appeler cette fonction. par exemple:

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

Salut merci .. Vous aviez raison. Les suggestions que vous avez trouvées ont été utiles, mais la cause principale en est la version 64 bits. Le FindMimeFromData fonctionnait uniquement en 32 bits. Je posterai plus tard en détail sur quel type d'erreur il a jeté. Pour l'instant, j'ai déplacé la logique vers un utilitaire exe 32 bits qui est appelé depuis mon application web avec l'aide de la classe Process. Voilà comment je l'ai résolu. Merci pour l'aide. –