urlmon.dll FindMimeFromData () funktioniert perfekt auf 64-Bit-Desktop / Konsole, generiert aber Fehler auf ASP.NET

8

Ich erstelle eine Bibliothek von Dienstprogrammen, die sowohl in einer Desktopumgebung als auch in einer Webumgebung verwendet werden können.

Es enthält einige Funktionen, von denen ich glaube, dass sie oft in meinen Anwendungen wiederholt werden, einschließlich Utility, um den MIME-Typ einer Datei nach ihrem Inhalt (nicht der Erweiterung) zu erhalten.

Die Dateien, die ich prüfen muss, sind die gebräuchlichsten (jpg, png, pdf, txt), also habe ich mich für die externe Methode FindMimeFromData (link oben)

entschieden

Mit .NET können Sie den MIME-Typ einer Datei basierend auf der Dateisignatur und nicht der Erweiterung finden

Die Methode funktioniert gut, mit Ausnahme der beiden falschen Mime-Typen JPG ( image/pjpg ) und PNG ( image/x-png ), die einfach durch eine Überprüfung vor der return-Anweisung gelöst werden können.

Die Bibliothek ist für die Plattform AnyCPU kompiliert, da sie auf Servern / Clients sowohl in 32 als auch in 64 Bit installiert werden muss.

Zum Zeitpunkt des Tests auf der Desktop-Umgebung funktioniert alles ordnungsgemäß für beide Anwendungen, die für x86 und x64 kompiliert wurden.

Beim Testen einer ASP.NET-Anwendung (eine leere Site mit einem HTTP-Handler für test) tritt ein Fehler vom Typ HRESULT auf, und der Debugger sagt mir, dass er keine weiteren Informationen bereitstellen kann.

Nach einigen Testkonfigurationen, einschließlich der Änderung der Identität des Pools im lokalen System (ohne Ergebnis), habe ich das Problem identifiziert:

Der Pool sollte 32-Bit-Anwendungen zulassen (siehe Bild oben).

Warum?

Es sollte nicht die dll urlmon.dll des 64bit Systems laden, wo wir jetzt sind?

Das ist ein großes Problem, weil die Methode FindMimeFromData von überall in diese Bibliothek aufgerufen werden kann:

Das Ergebnis ist, dass ein Aufruf dieser Methode durch eine andere Hilfsmethode diese Ausnahme auslösen kann und es daher schwierig macht, das Problem auch durch Debugging zu verfolgen.

Irgendwelche Ideen / Erfahrungen?

Betriebssysteme, die zum Testen verwendet werden

Desktop:

  1. Windows 8 x64 - funktioniert
  2. Windows 7 x64 - funktioniert
  3. Windows Server 2008 Standard R2 x64 - funktioniert
  4. Windows Server 2008 Standard x86 - funktioniert
  5. Windows Server 2003 Standard x86 - funktioniert
  6. Windows XP Professional SP3 - funktioniert

Web:

  1. Windows 8 x64 - erster Fehler gefunden, funktioniert nur mit 32bit-Anwendung aktiviert
  2. Windows Server 2008 Standard R2 x64 - Fehler bestätigt, funktioniert nur mit 32-Bit-Anwendung aktiviert
  3. Windows Server 2008 Standard x86 - funktioniert

EDIT 2 (Frage gelöst)

Gelöst von Nose- ratio :

Der korrekte Typ der Parameter ppwzMimeOut und pBC muss System.IntPtr anstelle von System.UInt32 sein.

Ich weiß, dass System.UInt32 Probleme in vollen 64-Bit-Web-Apps verursacht, aber ich weiß nicht warum.

Wenn jemand den Grund für diese Probleme kennt, kann man es in einem Kommentar besser erklären?

Vielen Dank im Voraus

    
T-moty 21.08.2013, 13:18
quelle

1 Antwort

10

Wenn Sie die pinvoke-Signatur aus der Antwort Ihrer verknüpften verwendet haben, ist sie dort wie folgt definiert:

%Vor%

Ich würde lieber die Definition von pinvoke.net verwenden:

%Vor%

Beachten Sie den Unterschied in den Typen für den Parameter ppwzMimeOut und pBC . Im ersten Fall ist System.UInt32 kein korrekter Typ für einen 64-Bit-Zeiger unter einer 64-Bit-Plattform. Für pBC ist dies wahrscheinlich kein Problem (solange es NULL ist), aber es ist wichtig für ppwzMimeOut .

Lesen Sie diese Implementierung , die korrekt zu sein scheint.

    
Noseratio 01.09.2013, 00:59
quelle

Tags und Links