我正在开发一个带有“插件”功能的MVC 3应用程序.该
插件是C#dll,嵌入了所有必需的资源(css,图像和脚本).
插件是C#dll,嵌入了所有必需的资源(css,图像和脚本).
我使用了“MvcRazorClassGenerator”Visual Studio扩展来创建预编译视图.
我使用以下代码检索嵌入的资源:
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错误.
我已尝试在此站点上安装问题所提及的热修复并更改配置文件,但未加载资源.
我正在尝试部署到Windows 2008 Server R2 SP1 64位.
解决方法
问题可能是使用
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任务执行此操作,详见this blog post.
<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>