2016-05-19 5 views
0

У меня есть проект с ASP.NET MVC и Web API в одном.asp.net routing при использовании MVC & Web-API

И я должен перенаправлять запросы от /assets/x/y/z.ext к /content/assets/x/y/z.ext

Это код, который я написал :

public class AssetsController : Controller 
{ 
    // GET: Assets 
    public ActionResult Redirect() 
    { 
     var url = HttpContext.Request.FilePath; 
     return base.Redirect("~/Content" + url); 
    } 
} 

И это содержание App_Start/RouteConfig.cs

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute("Assets", "assets/{*url}", new { controller = "Assets", action = "Redirect" }); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 
} 

Теперь по какой-то причине это не работает. Любая помощь для получения исправления приветствуется.

FYI:

  • код был скопирован из другого проекта, где он сделал работу.
  • Другой проект был чистым MVC
  • Я поставил точку останова в контроллере активов и никогда не вызывается.

ответ

0

Я нашел решение:

Видимо маршрутизации не применяется к «известным» типов файлов. Таким образом, ресурс, который я запрашивал, был «http://localhost:8080/assets/images/logo.png», и это не вызвало активацию контроллера. Но «http://localhost:8080/assets/images/logo.png/» сделал.

Так что мне пришлось указать, что я хотел, чтобы все файлы в папке с ресурсами были перенаправлены. Это делается путем добавления дополнительных настроек в файле web.config:

<system.webServer> 
    <modules> 
     <remove name="FormsAuthentication" /> 
    </modules> 
    <handlers> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
     <remove name="OPTIONSVerbHandler" /> 
     <remove name="TRACEVerbHandler" /> 

     <add name="AssetsPathContainsFiles" path="/assets/*" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 

     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
    </handlers> 
    </system.webServer> 

Примечание: Важно использовать path="/assets/*" и не path="assets/*" becuase второй также будет пытаться обрабатывать пути, как "/content/assets/images/logo.png" в то время как это должно быть обрабатывается стандартным обработчиком статических файлов ... (я полагаю, что ведущая косая черта заставляет путь корениться)

(Когда я использовал path="assets/*", он вызвал цикл, и браузеры дали мне «для многих ошибок перенаправления»).