2017-05-13 20 views
1

내 응용 프로그램이 Windows Server 2012 R2에 배포 된 ASP.NET MVC 웹 사이트입니다. 나는 내장 된 Windows 라이브러리 URLMoniker - urlmon.dll을 사용하여 파일의 MIME 유형을 얻고 있습니다. 파일 경로를 GetMimeType 메서드에 전달하고 있습니다. 내가 직면하고있는 문제는 Visual Studio를 사용하여 디버깅 할 때 해당 파일의 MIME 유형을 반환한다는 것입니다 (테스트 케이스에서는 txt 파일의 경우 "application/octet-stream"을 반환합니다). 그러나 프로덕션 서버에 배포 한 후 응용 프로그램 풀이 예기치 않게 중단되고 로그 파일에 로그가 없으므로이 코드 블록으로 이동하는 데 3 일이 걸렸습니다 (추가 로그 항목의 도움으로). 응용 프로그램 풀을 처리하는 프로세스 "여기서 SampleApp는"윈도우 프로세스 활성화 서비스의 심각한 통신 오류 : 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"; 
     } 
    } 

심지어 이벤트 뷰어이 제외 응용 프로그램 풀 충돌에 대한 이유를 표시하지 않습니다. 프로세스 ID는 'yyyy'입니다.

세부 연구를 수행 한 후에도 몇 가지 해결책을 제시 할 수있는 기사가 있지만이 문제의 정확한 원인을 찾을 수 없습니다. https://superuser.com/questions/568806/iis-worker-process-crashing-without-stack-trace-what-else-can-i-try

  • 그것은 urlmon.dll을 시스템에 등록되지 않을 수 있습니다하지만 난 윈도우 레지스트리에 확인하고는 등록 말한다 :

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

    2. 여기 이것은

      도 비슷한 문제에 직면했다. 사실 라이브러리가 최신이고 프로덕션 서버에서 레지스트리 변경 사항을 적용하기 전에 근본 원인을 찾아야합니다. dll을 새 버전으로 바꾸면 레지스트리 문제를 수정하는 것이 최후의 수단입니다. https://answers.microsoft.com/en-us/ie/forum/ie8-windows_7/urlmondll-causing-many-programs-to-crash/cda9a6cb-cf51-499c-8855-45c97110eafe

    3. 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 클래스의 도움으로 웹 응용 프로그램에서 호출되는 32 비트 exe 유틸리티로 로직을 옮겼습니다. 그게 내가 해결 한 방법이야. 도와 주셔서 감사합니다. –