2012-02-24 14 views
4

"プラグイン"機能を備えたMVC 3アプリケーションを開発しています。 プラグインは、必要なすべてのリソース(css、画像、スクリプト)が埋め込まれたC#dllです。MVC 3とIIS7から組込み埋め込みリソースを提供するにはどうすればよいですか?

"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 64bitに展開しようとしています。

答えて

3

問題は、私は同じセットを持っているが、内容は私が

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

を使うアクションから提供されているので、私はその後、ルート

を設定

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

の使用も可能

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> 

この方法を使用している場合は、埋め込みファイル(リリースビルド用)を縮小することもできます。これは、this blog postで詳しく説明した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

再利用可能な埋め込みリソースの管理に役立つMvcContribで利用可能なMVCフレームワークがあります。それはPortable Areasと呼ばれます。私はVoiceModelと呼ばれるオープンソースプロジェクトでこれを使っています。

+0

はい、私は(私はほとんどこのプロジェクトと私の上司を終えたので、私はすべて再engeneerに提案する場合は、幸せではないでしょう、おそらく将来の使用のため;)、このフレームワークを見てみましょう)。しかし、私の質問に関しては、URLに「ドット」がある場合、IISはアクションを呼び出さないようです...私はこれを回避する方法を行っていますが、現時点では「好奇心」です。 –

関連する問題