Asp.net mvc 3 如何为MVC 3和IIS7中的程序集嵌入式资源提供服务?
我正在开发一个具有“插件”功能的MVC3应用程序。这个 插件是嵌入了所有必需资源(css、图像和脚本)的C#dll 我使用了“MVCranchorClassGenerator”Visual Studio扩展来创建预编译视图 我使用以下代码检索嵌入式资源:Asp.net mvc 3 如何为MVC 3和IIS7中的程序集嵌入式资源提供服务?,asp.net-mvc-3,iis-7.5,embedded-resource,Asp.net Mvc 3,Iis 7.5,Embedded Resource,我正在开发一个具有“插件”功能的MVC3应用程序。这个 插件是嵌入了所有必需资源(css、图像和脚本)的C#dll 我使用了“MVCranchorClassGenerator”Visual Studio扩展来创建预编译视图 我使用以下代码检索嵌入式资源: public FileStreamResult EmbeddedResource(string pluginName, string resourceName) { Assembly assembly = PluginCache.GetAs
public FileStreamResult EmbeddedResource(string pluginName, string resourceName)
{
Assembly assembly = PluginCache.GetAssembly(pluginName);
if (assembly != null)
{
string tempResourceName =
assembly.GetManifestResourceNames()
.ToList().FirstOrDefault(f => f.EndsWith(resourceName));
return new FileStreamResult(
assembly.GetManifestResourceStream(tempResourceName),
GetMIMEType(tempResourceName));
}
return null;
}
在视图中,我有以下代码来访问资源:
@Url.Content("/Common/EmbeddedResource/PluginName/[AssemblyNamespace].Content.Images.blank.gif")
当我在开发环境中时,一切都正常工作,所有资源都已正确加载和显示,但在部署时,噩梦开始了
IIS 7.5一直在搜索名为“/Common/EmbeddedResource/PluginName/[AssemblyNamespace].Content.Images.blank.gif”的静态文件,而不是嵌入的文件,这给了我所有嵌入资源的404错误
我尝试在这个站点上安装一个问题提到的热修复程序并更改配置文件,但资源没有加载
我正在尝试部署到64位的Windows 2008服务器R2 SP1。中提供了一个MVC框架,用于帮助管理可重用的嵌入式资源。它被称为。我以前在一个名为的开源项目中使用过它,效果很好。问题可能在于
Url.Content("/Common/EmbeddedResource/PluginName/[AssemblyNamespace].Content.Images.blank.gif")
我有相同的设置,但由于内容是从我使用的一个动作提供的
@Url.Action("EmbeddedResource", "EmbeddedResources", new { pluginName = "PluginName", resourceName = "MyProject.Scripts.MyScript.js" })
然后我设置了一条路线
routes.MapRoute(
"EmbeddedResources",
"EmbeddedResources/{pluginName}/{resourceName}",
new { controller = "EmbeddedResources", action = "EmbeddedResource", pluginName = "DefaultPluginName", resourceName = UrlParameter.Optional });
这会导致这样的脚本引用
<script type='text/javascript' src='/EmbeddedResources/PluginName/MyProject.Scripts.MyScript.js'></script>
如果采用这种方法,您可能还希望缩小嵌入文件(用于发布版本)。可以使用MSBuild任务执行此操作,如中所述
MinifyJavaScript;
$(ResGenDependsOn)
是的,我会看一看这个框架(可能是为了将来使用,因为我几乎完成了这个项目,如果我提议重新设计所有框架,我的老板可能不会高兴)。但是关于我的问题,如果URL中有一个“点”,IIS似乎没有调用该操作。。。我已经为此做了一个变通办法,但现在只是。。“好奇心”
<Import Project="$(MSBuildExtensionsPath)\Microsoft\MicrosoftAjax\ajaxmin.tasks" />
<PropertyGroup>
<ResGenDependsOn>
MinifyJavaScript;
$(ResGenDependsOn)
</ResGenDependsOn>
</PropertyGroup>
<PropertyGroup>
<PostBuildEvent>
</PostBuildEvent>
</PropertyGroup>
<Target Name="MinifyJavaScript" Condition=" '$(ConfigurationName)'=='Release' ">
<Copy SourceFiles="@(EmbeddedResource)" DestinationFolder="$(IntermediateOutputPath)" Condition="'%(Extension)'=='.js'">
<Output TaskParameter="DestinationFiles" ItemName="EmbeddedJavaScriptResource" />
</Copy>
<AjaxMin JSSourceFiles="@(EmbeddedJavaScriptResource)" JsSourceExtensionPattern="\.js$" JsTargetExtension=".js" CssSourceFiles="@(CSS)" CssSourceExtensionPattern="\.css$" CssTargetExtension=".css" JSLocalRenaming="CrunchAll" />
<ItemGroup>
<EmbeddedResource Remove="@(EmbeddedResource)" Condition="'%(Extension)'=='.js'" />
<EmbeddedResource Include="@(EmbeddedJavaScriptResource)" />
<FileWrites Include="@(EmbeddedJavaScriptResource)" />
</ItemGroup>
</Target>