我的ASP.NET MVC应用程序中需要一个图像生成器,但我不知道是否可以在ASP.NET MVC中使用ASHX。
如果有一个类似于IHttpHandler的类继承了IViewDataContainer,那么我可以在我的ASHX上使用ViewData.Model。
我读了一个blog post about it,但我在ASP.NET forum
中收到的信息似乎已经过时了有什么想法吗?
答案 0 :(得分:32)
您也可以使用此ImageResult类返回图像。
不需要处理程序只需创建一个路由,例如:
/ ImageGenerator / {动作} / {图像标识} /
并为请求返回ImageResult。
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);
}
}
}
要使用此功能,请在控制器中执行以下操作并为其添加路径:
public ImageResult GetImage(int imageId)
{
// Database fetch of image details
var imageInfo = repository.Get<ImageInfo>(imageId);
return new ImageResult(imageInfo.FullFilename);
}
也添加了FileType助手类:
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);
}
}
}
答案 1 :(得分:14)
你应该能够从动作中返回图像吗?有关更多信息,请参阅此处。
是的,您可以将ashx与MVC一起使用(告诉它忽略该路由) - 但我不确定这是最好的方法,除非它是重用现有代码。
对不起伙计们,该链接已被删除。它发生了。