asp.net-mvc-3 – 如何从MVC 3和IIS7提供汇编嵌入式资源?

我正在开发一个带有“插件功能的MVC 3应用程序.该
插件是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>

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....