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

本文关键字:设置 嵌入式 资源 应用程序 MVC | 更新日期: 2023-09-27 18:22:20

我正在尝试为一些嵌入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

我试过用斜杠替换点,或者在末尾添加斜杠,但我想要的是一个简单的解决方案,它可以让我将看起来像文件的URL映射到实际文件。

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

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

同样值得一提的是,最初的路由也有同样的问题,它只是因为才起作用

<modules runAllManagedModulesForAllRequests="true" />

在web.config中,我认为这对性能来说不是一个好主意

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

设置时

  <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添加到模块堆栈中,您的URL现在应该可以正确解析了。注意:您需要通过nuget将WebActivator添加到您的项目中。