2009-03-11 9 views
21

je besoin d'un générateur d'images dans mon application ASP.NET MVC, mais je ne sais pas s'il est possible d'utiliser ASHX dans ASP.NET MVC.Comment utiliser les gestionnaires génériques (ASHX) dans ASP.NET MVC?

S'il existe une classe similaire à IHttpHandler qui hérite de IViewDataContainer, alors je pourrais utiliser ViewData.Model sur mon ASHX.

Je lis un blog post about it mais il semble dépassé de l'info je suis arrivé dans le ASP.NET forum

Toutes les idées?

Répondre

14

Vous devriez juste être en mesure de retourner l'image de l'action? Voir ici pour plus.

Et oui, vous pouvez utiliser ashx aux côtés de MVC (en lui disant d'ignorer la route) - mais je ne suis pas sûr que ce soit la meilleure approche à moins de réutiliser le code existant.


Désolé les gars, le lien a été supprimé. Ça arrive.

+0

(lots retirés des commentaires hors sujet) –

+5

[l'article est accessible par l'archive. cliquez ici] (http://web.archive.org/web/20090106030652/http://blog.rodj.org/archive/2008/09/24/asp.net-mvc-image-handler.aspx) –

31

Vous pouvez également utiliser cette classe ImageResult pour retourner une image.

Pas besoin d'un gestionnaire il suffit de créer un itinéraire tel que:

/ImageGenerator/{action}/{ImageID}/

et retourner un ImageResult pour la demande.

public class ImageResult : ActionResult 
    { 
     public string SourceFilename { get; set; } 
     public MemoryStream SourceStream { get; set; } 
     public string ContentType { get; set; } 
     public ImageResult(string sourceFilename) 
     { 
      SourceFilename = sourceFilename; 
      ContentType = FileTypeHelper.GetContentType(SourceFilename); 
     } 
     public ImageResult(MemoryStream sourceStream, string contentType) 
     { 
      SourceStream = sourceStream; 
      ContentType = contentType; 
     } 
     public override void ExecuteResult(ControllerContext context) 
     { 
      var res = context.HttpContext.Response; 
      res.Clear(); 
      res.Cache.SetCacheability(HttpCacheability.NoCache); 
      res.ContentType = ContentType; 

      if (SourceStream != null) 
      { 
       SourceStream.WriteTo(res.OutputStream); 

      } 
      else 
      { 
       res.TransmitFile(SourceFilename); 
      } 

     } 


    } 

Pour utiliser ce procédez comme suit dans un contrôleur et ajouter une route pour elle:

public ImageResult GetImage(int imageId) 
{ 
    // Database fetch of image details 
    var imageInfo = repository.Get<ImageInfo>(imageId); 
    return new ImageResult(imageInfo.FullFilename); 
} 

ont ajouté la classe d'aide FileType aussi:

public static class FileTypeHelper 
{ 
    public static string GetContentType(string SourceFileName) 
    { 
     var extension = Path.GetExtension(SourceFileName).ToLower(); 
     switch (extension) 
     { 
      case ".ai": return "application/postscript"; 
      case ".aif": return "audio/x-aiff"; 
      case ".aifc": return "audio/x-aiff"; 
      case ".aiff": return "audio/x-aiff"; 
      case ".asc": return "text/plain"; 
      case ".au": return "audio/basic"; 
      case ".avi": return "video/x-msvideo"; 
      case ".bcpio": return "application/x-bcpio"; 
      case ".bin": return "application/octet-stream"; 
      case ".c": return "text/plain"; 
      case ".cc": return "text/plain"; 
      case ".ccad": return "application/clariscad"; 
      case ".cdf": return "application/x-netcdf"; 
      case ".class": return "application/octet-stream"; 
      case ".cpio": return "application/x-cpio"; 
      case ".cpp": return "text/plain"; 
      case ".cpt": return "application/mac-compactpro"; 
      case ".cs": return "text/plain"; 
      case ".csh": return "application/x-csh"; 
      case ".css": return "text/css"; 
      case ".dcr": return "application/x-director"; 
      case ".dir": return "application/x-director"; 
      case ".dms": return "application/octet-stream"; 
      case ".doc": return "application/msword"; 
      case ".drw": return "application/drafting"; 
      case ".dvi": return "application/x-dvi"; 
      case ".dwg": return "application/acad"; 
      case ".dxf": return "application/dxf"; 
      case ".dxr": return "application/x-director"; 
      case ".eps": return "application/postscript"; 
      case ".etx": return "text/x-setext"; 
      case ".exe": return "application/octet-stream"; 
      case ".ez": return "application/andrew-inset"; 
      case ".f": return "text/plain"; 
      case ".f90": return "text/plain"; 
      case ".fli": return "video/x-fli"; 
      case ".flv": return "video/x-flv"; 
      case ".gif": return "image/gif"; 
      case ".gtar": return "application/x-gtar"; 
      case ".gz": return "application/x-gzip"; 
      case ".h": return "text/plain"; 
      case ".hdf": return "application/x-hdf"; 
      case ".hh": return "text/plain"; 
      case ".hqx": return "application/mac-binhex40"; 
      case ".htm": return "text/html"; 
      case ".html": return "text/html"; 
      case ".ice": return "x-conference/x-cooltalk"; 
      case ".ief": return "image/ief"; 
      case ".iges": return "model/iges"; 
      case ".igs": return "model/iges"; 
      case ".ips": return "application/x-ipscript"; 
      case ".ipx": return "application/x-ipix"; 
      case ".jpe": return "image/jpeg"; 
      case ".jpeg": return "image/jpeg"; 
      case ".jpg": return "image/jpeg"; 
      case ".js": return "application/x-javascript"; 
      case ".kar": return "audio/midi"; 
      case ".latex": return "application/x-latex"; 
      case ".lha": return "application/octet-stream"; 
      case ".lsp": return "application/x-lisp"; 
      case ".lzh": return "application/octet-stream"; 
      case ".m": return "text/plain"; 
      case ".man": return "application/x-troff-man"; 
      case ".me": return "application/x-troff-me"; 
      case ".mesh": return "model/mesh"; 
      case ".mid": return "audio/midi"; 
      case ".midi": return "audio/midi"; 
      case ".mime": return "www/mime"; 
      case ".mov": return "video/quicktime"; 
      case ".movie": return "video/x-sgi-movie"; 
      case ".mp2": return "audio/mpeg"; 
      case ".mp3": return "audio/mpeg"; 
      case ".mpe": return "video/mpeg"; 
      case ".mpeg": return "video/mpeg"; 
      case ".mpg": return "video/mpeg"; 
      case ".mpga": return "audio/mpeg"; 
      case ".ms": return "application/x-troff-ms"; 
      case ".msh": return "model/mesh"; 
      case ".nc": return "application/x-netcdf"; 
      case ".oda": return "application/oda"; 
      case ".pbm": return "image/x-portable-bitmap"; 
      case ".pdb": return "chemical/x-pdb"; 
      case ".pdf": return "application/pdf"; 
      case ".pgm": return "image/x-portable-graymap"; 
      case ".pgn": return "application/x-chess-pgn"; 
      case ".png": return "image/png"; 
      case ".pnm": return "image/x-portable-anymap"; 
      case ".pot": return "application/mspowerpoint"; 
      case ".ppm": return "image/x-portable-pixmap"; 
      case ".pps": return "application/mspowerpoint"; 
      case ".ppt": return "application/mspowerpoint"; 
      case ".ppz": return "application/mspowerpoint"; 
      case ".pre": return "application/x-freelance"; 
      case ".prt": return "application/pro_eng"; 
      case ".ps": return "application/postscript"; 
      case ".qt": return "video/quicktime"; 
      case ".ra": return "audio/x-realaudio"; 
      case ".ram": return "audio/x-pn-realaudio"; 
      case ".ras": return "image/cmu-raster"; 
      case ".rgb": return "image/x-rgb"; 
      case ".rm": return "audio/x-pn-realaudio"; 
      case ".roff": return "application/x-troff"; 
      case ".rpm": return "audio/x-pn-realaudio-plugin"; 
      case ".rtf": return "text/rtf"; 
      case ".rtx": return "text/richtext"; 
      case ".scm": return "application/x-lotusscreencam"; 
      case ".set": return "application/set"; 
      case ".sgm": return "text/sgml"; 
      case ".sgml": return "text/sgml"; 
      case ".sh": return "application/x-sh"; 
      case ".shar": return "application/x-shar"; 
      case ".silo": return "model/mesh"; 
      case ".sit": return "application/x-stuffit"; 
      case ".skd": return "application/x-koan"; 
      case ".skm": return "application/x-koan"; 
      case ".skp": return "application/x-koan"; 
      case ".skt": return "application/x-koan"; 
      case ".smi": return "application/smil"; 
      case ".smil": return "application/smil"; 
      case ".snd": return "audio/basic"; 
      case ".sol": return "application/solids"; 
      case ".spl": return "application/x-futuresplash"; 
      case ".src": return "application/x-wais-source"; 
      case ".step": return "application/STEP"; 
      case ".stl": return "application/SLA"; 
      case ".stp": return "application/STEP"; 
      case ".sv4cpio": return "application/x-sv4cpio"; 
      case ".sv4crc": return "application/x-sv4crc"; 
      case ".swf": return "application/x-shockwave-flash"; 
      case ".t": return "application/x-troff"; 
      case ".tar": return "application/x-tar"; 
      case ".tcl": return "application/x-tcl"; 
      case ".tex": return "application/x-tex"; 
      case ".tif": return "image/tiff"; 
      case ".tiff": return "image/tiff"; 
      case ".tr": return "application/x-troff"; 
      case ".tsi": return "audio/TSP-audio"; 
      case ".tsp": return "application/dsptype"; 
      case ".tsv": return "text/tab-separated-values"; 
      case ".txt": return "text/plain"; 
      case ".unv": return "application/i-deas"; 
      case ".ustar": return "application/x-ustar"; 
      case ".vcd": return "application/x-cdlink"; 
      case ".vda": return "application/vda"; 
      case ".vrml": return "model/vrml"; 
      case ".wav": return "audio/x-wav"; 
      case ".wrl": return "model/vrml"; 
      case ".xbm": return "image/x-xbitmap"; 
      case ".xlc": return "application/vnd.ms-excel"; 
      case ".xll": return "application/vnd.ms-excel"; 
      case ".xlm": return "application/vnd.ms-excel"; 
      case ".xls": return "application/vnd.ms-excel"; 
      case ".xlw": return "application/vnd.ms-excel"; 
      case ".xml": return "text/xml"; 
      case ".xpm": return "image/x-xpixmap"; 
      case ".xwd": return "image/x-xwindowdump"; 
      case ".xyz": return "chemical/x-pdb"; 
      case ".zip": return "application/zip"; 
      default: return string.Format("application/{0}", extension); 
     } 
    } 
} 
+0

générique Le gestionnaire est 7,23 fois plus rapide que l'approche MVC. – Adeel

+0

@Adeel, avez-vous des échantillons pour le gestionnaire générique? Pas sûr de ce que vous voulez dire. – Picflight

+0

@Richard, comment utilisez-vous cette ImageResult? Ajout – Picflight