微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐