2012-02-24 3 views
4

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

Я использовал расширение 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 для всех встроенных ресурсов.

Я попытался установить исправление, упомянутое в вопросе на этом сайте, и изменить файлы конфигурации, но ресурсы не загружены.

Я пытаюсь установить на Windows 2008 Server R2 SP1 64 бит.

ответ

3

Проблема может быть использование

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> 
0

Существует инфраструктура MVC, доступная в MvcContrib, чтобы помочь в управлении повторно используемыми встроенными ресурсами. Он называется Portable Areas. Я использовал его раньше в проекте с открытым исходным кодом под названием VoiceModel, и он отлично работает.

+0

да, я буду смотреть на эти рамки, (вероятно, для использования в будущем, потому что я почти закончил этот проект, и мой босс, не был бы счастлив, если я предлагаю повторно инженер все;)). Но в отношении моего вопроса кажется, что IIS не вызывает действие, если в URL есть «точка» ... Я сделал обходной путь для этого, но в это время это просто ... «любопытство», –

Смежные вопросы