2010-09-23 22 views
15

Chciałbym zwrócić obraz jako ActionResult z kontrolera MVC2. Ten obraz jest białym pikselem 1x1 (dla aplikacji śledzącej). Nie chcę odwoływać się do obrazu na dysku lub w bazie danych. Chciałbym wygenerować obraz w mojej metodzie, a następnie zwrócić go z działania kontrolera.Wygeneruj biały gif 1x1 jako strumień wC#

Każdy wie, jak wygenerować biały obraz 1x1, który może zostać przekazany do obiektu FileStreamResult w celu powrotu z działania kontrolera?

+2

Nie to rozwiązuje twój problem, ale powinieneś użyć przezroczystego piksela 1x1 w formacie '.png'. W ten sposób możesz używać go na różne tematy. – Stephen

Odpowiedz

16

Skopiowane z Daniel Ballinger's FishOfPrey.com:

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

nie znam C#, ale jeśli używasz ten ciąg w programie można zapisać przechowywania i dostępu jeden dodatkowy plik na dysku.

+1

myślę, że należy być może obejmować/przepisać treść post tutaj więc jeśli dzieje się na śmierć, odpowiedź będzie nadal użyteczny – samy

+8

lub użyj 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQI12P4DwQACfsD/WMmxY8AAAAASUVORK5CYII =' krótszy 1x1 png – cobbal

+3

oh, i użycie 'obrazu/png' zamiast 'image/gif' jeśli używasz mojego ciągu znaków – cobbal

5

Unikaj używania Response.End();, stosowany w odpowiedzi eumiro, a nie jest dobrym pomysłem, czytaj więcej tutaj: http://support2.microsoft.com/kb/312629

Insted, aby uniknąć niepotrzebnego ThreadAbortException zmienić swoje działanie do FileContentResult jak ten:

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

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

również dla celów śledzenia należy dodać jakiś rodzaj NoCache attribute

2

wolę używać obrazów z rozszerzeniami więc to co używam:

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