我被问到是否可以阻止Content目录作为Asp.Net MVC 3.0应用程序中url的一部分出现。例如,目前我想在Content文件夹的子目录中查看图像时,网址如下:
http://localhost:[port]/Content/sub/test.bmp
虽然我们希望将其显示如下:
http://localhost:[port]/sub/test.bmp
Test.bmp仍然存在于服务器上Content文件夹的子目录中,我们只想隐藏内容部分。
有什么建议吗?我可以看到屏蔽控制器的方法,但不能看到目录。
答案 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;
}
}
}