c# - parametro - Parámetros validateImageData e Image.FromStream()
system drawing dll (4)
¿Por qué no solo intentas ver qué sucede con ese marcador establecido y no configurado?
En cualquier caso, debe manejar cualquier excepción que pueda lanzarse.
Me preocupa el tercer parámetro en esta sobrecarga, validateImageData. La documentación no explica mucho al respecto, solo establece que hace que los datos de la imagen sean validados, pero no hay detalles, ¿qué se hace exactamente para validar los datos de la imagen?
public static Image FromStream (
Stream stream,
bool useEmbeddedColorManagement,
bool validateImageData
)
Quiero usar esto en una aplicación web, por lo tanto, quiero saber qué sucederá exactamente si configuro validateImageData como verdadero, quiero estar seguro de que lo que el usuario carga es una imagen válida, ¿se recomienda establecer validateDataData en verdadero? ¿o es suficiente para atrapar la excepción si uno es arrojado? Además, ¿la configuración validateDataData puede afectar el rendimiento de alguna manera? (los usuarios pueden cargar imágenes de hasta 250k de tamaño)
Gracias
Al examinar el interior del reflector, verá que, de manera predeterminada, .NET siempre llama a una API nativa en las bibliotecas de GDI + llamada GdipImageForceValidation (que pasa el valor verdadero para el parámetro validateImageData). No puedo encontrar mucho acerca de la API nativa en MSDN , solo esto , que no nos dice más que el nombre de la función en sí. Sin embargo, parece que este método provoca una degradación del rendimiento basada en la publicación de Justin Roger sobre la carga de imágenes de la manera más rápida posible a través de .NET. También es intuitivo esperar que cualquier paso de "validación" elimine el rendimiento.
Sin embargo, si especifica false para el parámetro validateImageData, .NET desencadenará de forma explícita una demanda de seguridad de código no administrada , lo que significa que los autores del framework decidieron que forzar la validación de imágenes era necesario para garantizar la seguridad del código administrado y, finalmente, poder confíe en los datos que la persona que llama dice que representan una imagen. Por lo tanto, aunque especificar flase para validateImageData puede aumentar el rendimiento, en un contexto de seguridad que no sea de plena confianza , puede generar una excepción, y es mejor que confíe en los datos que cree que son una imagen.
Recuerdo haber leído algunos problemas con ese parámetro. Mira esta publicación (es bastante antigua pero solo para ser cuidadoso).
Desde Reflector, vemos:
if (validateImageData)
{
num = SafeNativeMethods.Gdip.GdipImageForceValidation(new HandleRef(null, zero));
if (num != 0)
{
SafeNativeMethods.Gdip.GdipDisposeImage(new HandleRef(null, zero));
throw SafeNativeMethods.Gdip.StatusException(num);
}
}
Entonces vemos que se llama a GdipImageForceValidation (recall, System.Drawing es solo un contenedor sobre GDI +). La documentación para esta función no es muy buena:
Esta función fuerza la validación de la imagen.
No es muy útil. Sin embargo, se trata de un punto: el archivo de imagen es interrogado para asegurar que sea seguro de cargar. Esto puede provocar que la imagen completa se cargue en la memoria.
Si está aceptando entradas de los usuarios, sin duda establecería este indicador como verdadero; nunca se sabe qué tipo de archivos (incorrectos o no) cargarán los usuarios. Más vale prevenir que curar. Esta es la razón por la cual el valor predeterminado es true
.
Tenga en cuenta también que GDI + no se recomienda para entornos de servidor. Es mejor que System.Windows.Media.Imaging
.