Как обслуживать встроенные ресурсы сборки из MVC 3 и IIS7? - PullRequest
4 голосов
/ 24 февраля 2012

Я разрабатываю приложение MVC 3 с функциональностью «плагина».Плагины - это C # dll со всеми необходимыми ресурсами (CSS, изображениями и сценариями).

Я использовал расширение Visual Studio "MvcRazorClassGenerator" для создания предварительно скомпилированных представлений.

Я получаю встроенныересурс, используя следующий код:

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 Server R2 SP1.

Ответы [ 2 ]

3 голосов
/ 22 июня 2012

Проблема может заключаться в использовании

Url.Content("/Common/EmbeddedResource/PluginName/[AssemblyNamespace].Content.Images.blank.gif")

У меня такая же настройка, но так как содержимое подается из действия, которое я использую

@Url.Action("EmbeddedResource", "EmbeddedResources", new { pluginName = "PluginName", resourceName = "MyProject.Scripts.MyScript.js" })

Затем я настраиваюroute

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, как описано в этом блоге .

 <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>
0 голосов
/ 24 февраля 2012

В MvcContrib имеется инфраструктура MVC, помогающая управлять многократно используемыми встроенными ресурсами.Он называется Переносные зоны .Я использовал его ранее в проекте с открытым исходным кодом под названием VoiceModel , и он прекрасно работает.

...