2014-12-09 5 views
0

Я пытаюсь настроить маршрутизацию в своем приложении таким образом: пути к файлам должны работать для каждого каталога, кроме одного специального. И доступ к файлам в этой директории должен обрабатываться действием моего контроллера. Если я напишу smth вот так:ASP.NET MVC - доступ к файлам

routes.Map("Specialfolder/{name}", "Controller", "Action"); 

он работает только для файлов, не являющихся действительными. Контроллер не ловит маршрут для существующего файла

Если добавить эту строку:

routes.RouteExistingFiles = true; 

Работа с файлами в моей папке нормально. Но файлы в других каталогах больше не маршрутизируются. Как это исправить?

+0

Пробовал ли вы использовать расширение файла как часть конфигурации маршрута. Вы можете tryhttp: //haacked.com/archive/2008/03/13/url-routing-debugger.aspx/ – Saravanan

+0

Вы можете попробовать с фильтрами действий разрешить/запретить запрос этому конкретному контроллеру. Таким образом, исходя из этого условия (условий), которое вы указываете в этом фильтре действий, ответ будет подан или отклонен. – Venkat

+0

@saravanan Спасибо за ссылку, я могу использовать ее для тестирования. но вы хотите написать все существующие расширения файлов в маршрутах? – lenden

ответ

0

Вот пример ActionFilter образец фрагмент кода, который вы можете использовать

public class UriActionFilter : System.Web.Mvc.ActionFilterAttribute 
{ 
    public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext) 
    { 
     if (System.Threading.Thread.CurrentPrincipal.Identity.IsAuthenticated) 
     { 
      // Sample: somehow identify the user, in case of a custom identity, replace the below line to get the user identifier 
      var user = System.Threading.Thread.CurrentPrincipal.Identity.Name; 

      // get the parameter that will let you know what is the image or path that is being requested now 
      var ctxParams = filterContext.ActionParameters; 

      // if the user does not have the permission to view, return 403 
      filterContext.RequestContext.HttpContext.Response.StatusCode = 403; 
      return; 
     } 
     base.OnActionExecuting(filterContext); 
    } 
} 

В этом фрагменте кода, вы должны заменить соответствующие вызовы служб и т.д ..

WRTO OnAuthorization, я был упомянув, что вы можете использовать так, чтобы любой, получающий доступ к изображению, мог напрямую попасть в URI и использовать фильтр. Мы используем этот способ, чтобы ограничить доступ URI непосредственно данным пользователем.

Это поможет вам переопределить авторизацию MVC каждого запроса, который получает контроллер. Это больше ограничивает только URI. Однако ваш случай может быть удовлетворен вышеупомянутым фильтром действий, так как разбор параметров uri может быть довольно сложным в разы.

+0

И можете ли вы также привести пример, что писать в RouteConfig? Должен ли я включать «RouteExistingFiles»? И как использовать фильтр после этого? – lenden

+1

что-то вроде этого 'routes.IgnoreRoute (" {* staticfile} ", new {staticfile = @". * \. (Ico | css | js | gif | jpg | woff | eot | svg | eot | ttf | otf) (/.*)? "});' Я использую это, чтобы пропустить маршрутизацию для статических файлов. вы тоже можете сформировать подобное регулярное выражение в соответствии с вашими потребностями – Saravanan

+0

спасибо, я его окончательно переделал! Я использовал это: 'routes.IgnoreRoute (" {* staticfile} ", новый {staticfile = @" (\ w | \ - | \.) * \. (Png | ico | css | js | gif | jpg | woff | eot | svg | eot | ttf | otf) (/.*)? "});', 'routes.IgnoreRoute (" {* staticfile} ", новый {staticfile = @" Содержимое/(\ w | \ - |/|. \) * \ (PNG |. ICO | CSS | JS | GIF | JPG | Уофф | СРВ | SVG | СРВ | TTF | OTF) (/.*)?"});' для стандартного возврата файла для сайта/файла и для файла site/Content /.../. Для заблокированных файлов я использовал 'routes.Map (« Myfolder/{name} »,« General »,« GetBlockedData »,); 'На самом деле я не использовал фильтр действий, потому что вопрос о вопросе был просто« routes.IgnoreRoute »из вашего комментария :) – lenden

Смежные вопросы