2014-09-17 2 views
0

Я пытаюсь служить некоторые JS и CSS файлы, которые встроены в DLL, с раствором на основе этого подхода здесь: http://weblogs.asp.net/imranbaloch/asp-net-bundling-and-minification-and-embedded-resourcesКак настроить внедренных ресурсов в приложении MVC

так, JavaScript и CSS файлы встроены, и я создаю для них пакеты. Мои проблемы начинаются потому, что, имея немало из них, мне нужна структура папок, чтобы поддерживать порядок. Таким образом, оригинальный маршрут

RouteTable.Routes.Insert(0, 
new Route("Embedded/{file}.{extension}", 
    new RouteValueDictionary(new { }), 
    new RouteValueDictionary(new { extension = "css|js" }), 
    new EmbeddedResourceRouteHandler() 
)); 

уже не достаточно, поэтому я изменил его к этому:

RouteTable.Routes.Insert(0, 
new Route("Embedded/{*url}", 
    new RouteValueDictionary(new { }), 
    new EmbeddedResourceRouteHandler() 
)); 

Я также не могу использовать расширенную часть, потому что всеобъемлющая часть должна быть последним Итак, теперь, если я попытаюсь получить доступ к чему-либо, что похоже на файл, мой маршрут никогда не будет использоваться, поэтому я просто получу 404

Я попытался заменить точку косой чертой или добавить косую черту в конце, но что Я после этого - это простое решение, которое позволит мне для сопоставления URL-адресов, которые выглядят как файлы в реальных файлах.

Я также искал в Интернете и там, кажется, решения, основанные на UrlRewrite или изменения web.config, но: - Я не хотел бы изменить настройки IIS для каждого приложения для размещения библиотеки - так как это библиотека, я бы хотел, чтобы она была автономной, и разработчики, которые ее используют, не должны заботиться об этих типах внутренних проблем.

Итак, есть ли решение, которое я могу реализовать в своей библиотеке для этого?

Также стоит отметить, что оригинальный маршрутизации была такая же проблема, он работал только из-за

<modules runAllManagedModulesForAllRequests="true" /> 

в web.config, который я не думаю, что это хорошая идея для выполнения

ответ

1

При установке

<modules runAllManagedModulesForAllRequests="true" /> 

это позволяет использовать все доступные модули для работы с запросом. Который, как вы упомянули, не лучший для производительности. Однако вы могли бы добавить только тот модуль, который вам действительно нужен, в этом случае UrlRoutingModule.

Вы можете добавить этот модуль так:

<system.webServer> 
    <modules> 
     <remove name="UrlRoutingModule-4.0" /> 
     <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" /> 
    </modules> 
    </system.webServer> 

Если вы хотите еще лучший способ (ИМО), чтобы сделать это, игнорирование WebConfig и добавить его в файл AppStart.cs в библиотеку классов.

using Microsoft.Web.Infrastructure.DynamicModuleHelper; 

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(AppStart), "PreStart")] 
[assembly: WebActivatorEx.PostApplicationStartMethod(typeof(AppStart), "Start")] 
namespace EmbeddedPages 
{ 
    public static class AppStart 
    { 
     private static bool PreStartFired = false; 

     public static void PreStart() 
     { 
      if (!PreStartFired) 
      { 
       PreStartFired = true; 
       DynamicModuleUtility.RegisterModule(typeof(UrlRoutingModule)); 
      } 
     } 
    } 
} 

Это добавляет UrlRoutingModule в стек модулей, и ваши URL-адреса должны теперь корректно решаться. Примечание. Вам нужно будет добавить WebActivator в свой проект через nuget.

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