加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 09:50:48 所属栏目:asp.Net 来源:网络整理
导读:我正在开发一个带有“插件”功能的MVC 3应用程序.该 插件是C#dll,嵌入了所有必需的资源(css,图像和脚本). 我使用了“MvcRazorClassGenerator”Visual Studio扩展来创建预编译视图. 我使用以下代码检索嵌入的资源: public FileStreamResult EmbeddedResource
我正在开发一个带有“插件”功能的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)MicrosoftMicrosoftAjaxajaxmin.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>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读