ASP.NET MVC Скрыть каталог содержимого в URL - PullRequest
2 голосов
/ 26 июля 2011

Меня попросили проверить, можно ли предотвратить отображение каталога Content как части URL-адреса в приложении Asp.Net MVC 3.0.Например, в настоящее время, когда я хочу просмотреть изображение в подкаталоге папки Content, URL-адрес выглядит следующим образом:

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

В то время как мы хотим отобразить его просто следующим образом:

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

Test.bmp будет по-прежнему физически существовать в подкаталоге папки Content на сервере, мы просто хотим скрыть часть Content.

Есть предложения?Я вижу способы маскировки контроллеров, но не каталогов.

Ответы [ 2 ]

5 голосов
/ 26 июля 2011

Вы можете написать действие контроллера, которое будет принимать в качестве аргумента имя файла и обслуживать его из каталога sub.Затем настройте маршрут для этого действия контроллера, чтобы он был доступен с sub/{filename}.

2 голосов
/ 27 июля 2011

Решение выглядит следующим образом (на данный момент это просто базовый код, который необходимо привести в порядок):

Добавлен этот маршрут в 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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...