2010-09-23 4 views
15

Je voudrais retourner une image en tant que ActionResult à partir d'un contrôleur MVC2. Cette image est un pixel blanc 1x1 (pour une application de suivi). Je ne veux pas référencer une image sur le disque ou dans une base de données. Je voudrais générer l'image dans ma méthode, puis la renvoyer de l'action du contrôleur.Générer un gif blanc 1x1 comme un flux dans C#

Tout savoir comment générer une image blanche 1x1 qui peut être passé dans un FileStreamResult pour le retour de l'action du contrôleur?

+2

pas que cela résout votre problème, mais vous devez utiliser un pixel transparent 1x1 au format '.png'. De cette façon, vous pouvez l'utiliser sur une variété de thèmes. – Stephen

Répondre

16

Copié à partir Daniel Ballinger's FishOfPrey.com:

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

Je ne parle pas C#, mais si vous utilisez cette chaîne dans votre programme, vous pouvez enregistrer le stockage et l'accès à un fichier supplémentaire sur le disque.

+1

Je pense que vous devriez peut-être inclure/réécrire le contenu du message ici donc si votre arrive à mourir, la réponse sera toujours utile – samy

+8

ou utilisez 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQI12P4DwQACfsD/WMmxY8AAAAASUVORK5CYII =' pour un 1x1 plus court .png – cobbal

+3

oh, et utiliser 'image/png' au lieu de 'image/gif' si vous utilisez ma chaîne – cobbal

5

Évitez l'utilisation de Response.End();, tel qu'il est utilisé dans la réponse de eumiro, est pas une bonne idée, lire la suite ici: http://support2.microsoft.com/kb/312629

Insted, pour éviter ThreadAbortException inutiles, changer votre action à un FileContentResult comme celui-ci:

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

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

aussi à des fins de suivi se rappeler d'ajouter une sorte de NoCache attribute

2

Je préfère utiliser des images avec des extensions c'est donc ce que j'utilise:

// 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"); 
    } 
Questions connexes