如何在MVC应用程序中设置嵌入式资源

时间:2014-09-17 11:36:35

标签: c# .net asp.net-mvc

我正在尝试提供嵌入到DLL中的一些JS和CSS文件,并在此基于此方法提供解决方案:http://weblogs.asp.net/imranbaloch/asp-net-bundling-and-minification-and-embedded-resources

所以,嵌入了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()
));

我也不能使用扩展部分,因为catch-all部分必须是最后一部分 所以现在如果我尝试访问任何看起来像文件的东西,我的路线将永远不会被使用所以我只会得到一个404

我尝试用斜线替换点或在末尾添加斜杠,但我在此之后是一个简单的解决方案,它允许我将看起来像文件的网址映射到实际文件。

我也在网上搜索过,似乎有基于UrlRewrite或改变web.config的解决方案,但是: - 我不想为每个应用程序修改IIS设置以容纳库 - 因为它是一个库,我希望它是自包含的,使用它的开发人员不应该关心这些内部问题

那么,我可以在我的库中实现一个解决方案吗?

另外值得一提的是原始路由具有相同的问题,它只能用于

<modules runAllManagedModulesForAllRequests="true" />
web.config中的

,我认为这不是一个好主意

1 个答案:

答案 0 :(得分: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>

如果您想要更好的方法(IMO),请忽略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添加到模块堆栈中,您的网址现在应该正确解析。注意:您需要通过nuget将WebActivator添加到项目中。