ASP.NET MVC在URL中隐藏内容目录

时间:2011-07-26 17:30:46

标签: c# asp.net-mvc-3

我被问到是否可以阻止Content目录作为Asp.Net MVC 3.0应用程序中url的一部分出现。例如,目前我想在Content文件夹的子目录中查看图像时,网址如下:

http://localhost:[port]/Content/sub/test.bmp

虽然我们希望将其显示如下:

http://localhost:[port]/sub/test.bmp

Test.bmp仍然存在于服务器上Content文件夹的子目录中,我们只想隐藏内容部分。

有什么建议吗?我可以看到屏蔽控制器的方法,但不能看到目录。

2 个答案:

答案 0 :(得分:5)

您可以编写一个控制器操作,该操作将文件名作为参数,并从sub目录提供。然后为此控制器操作配置路由,以便可以使用sub/{filename}访问它。

答案 1 :(得分:2)

解决方案如下(这只是目前的准系统代码,需要整理):

将此路线添加到Global.asax:

routes.MapRoute("Content",
                "{dir}/{file}",
                new { controller = "Content", action = "LoadContent"});

添加了此控制器来处理请求:

namespace demos
{
   public class ContentController : Controller
    {
        public ActionResult LoadContent(string dir, string file)
        {
            string fileName = Server.MapPath(Url.Content("~/Content/" + dir)) 
            fileName += "\\" + file;            

            // stream file if exists    
            FileInfo info = new FileInfo(fileName);
            if (info.Exists)
                return File(info.OpenRead(), MimeType(fileName));


            // else return null - file not found
            return null;            
        }


        private string MimeType(string filename)
        {
            string mime = "application/octetstream";
            var extension = Path.GetExtension(filename);
            if (extension != null)
            {
               RegistryKey rk = Registry.ClassesRoot.OpenSubKey(extension.ToLower());

                if (rk != null && rk.GetValue("Content Type") != null)
                    mime = rk.GetValue("Content Type").ToString();
            }

            return mime;
        }
    }
}