如何在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中,我认为这对性能来说不是一个好主意
设置时
<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添加到您的项目中。