2010-09-23 17 views
15

Me gustaría devolver una imagen como un resultado de acción desde un controlador MVC2. Esta imagen es un píxel blanco de 1x1 (para una aplicación de seguimiento). No quiero hacer referencia a una imagen en el disco o en una base de datos. Me gustaría generar la imagen en mi método y luego devolverla desde la acción del controlador.Generar un gif blanco 1x1 como un flujo en C#

¿Alguien sabe cómo generar una imagen blanca de 1x1 que se puede pasar a FileStreamResult para regresar desde la acción del controlador?

+2

que resuelve su problema, pero debería utilizar un píxel transparente de 1x1 en formato '.png'. De esta forma puedes usarlo en una variedad de temas. – Stephen

Respuesta

16

Copiado del Daniel Ballinger's FishOfPrey.com:

Response.Clear(); 
string content = @"R0lGODlhAQABAPcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAABAAEAAAgEAP8FBAA7"; 
Response.ContentType = "image/gif"; 
Response.BinaryWrite(System.Convert.FromBase64String(content)); 
Response.End(); 

no hablo C#, pero si se utiliza esta cadena en su programa, usted puede ahorrar almacenar y acceder a un archivo adicional en el disco.

+1

Creo que quizás debería incluir/reescribir el contenido post aquí así que si su sucede a morir, la respuesta seguirá siendo útil – samy

+8

o usar 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQI12P4DwQACfsD/WMmxY8AAAAASUVORK5CYII =' para un 1x1 más corto png – cobbal

+3

ah, y usar 'imagen/png' en lugar de 'image/gif' si usas mi cadena – cobbal

5

Evitar el uso de Response.End();, tal como se utiliza en la respuesta de eumiro, no es una buena idea, leer más aquí: http://support2.microsoft.com/kb/312629

Insted, para evitar innecesarios ThreadAbortException, cambiar su acción a una FileContentResult así:

public FileContentResult Track(Guid id) 
{ 
    //do tracking stuff .... 

    //return empty gif 
    const string clearGif1X1 = "R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="; 
    return new FileContentResult(
         Convert.FromBase64String(clearGif1X1), "image/gif"); 
} 

también para fines de seguimiento recordar añadir algún tipo de NoCache attribute

2

yo prefiero usar imágenes con extensiones así que esto es lo que yo uso:

// URL is /mailers/images/pixel123.gif 
    // where 123 is the tracking number 
    [ActionName("images")] 
    public ActionResult Pixel(string id) 
    { 
     int trackingID = int.Parse(id.Substring("pixel".Length, id.Length - "pixel.gif".Length)); 

     // do something in database 

     string trackingPixel = @"R0lGODlhAQABAPcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAABAAEAAAgEAP8FBAA7"; 
     return File(System.Convert.FromBase64String(trackingPixel), "image/gif"); 
    } 
no
Cuestiones relacionadas