6

質問

プリコンパイルせずに Web デプロイメント プロジェクトを使用して Web アプリケーション プロジェクトを公開することはできますか?

ノート

Web コントロールとページを別のアセンブリに分割するために、カスタム VirtualPathProvider を使用してこれらのリソースを読み込みます。これらのプロジェクトを展開するために、コマンド ラインで Web 展開プロジェクトと msbuild を使用しています。

問題の核心は、VirtualPathProviders がプリコンパイル済みアプリケーションに対してサポートされていないことです。ここで、通常のファイルの回避策を見つけました。ascxただし、これはやaspxページなどのアプリケーション ファイルでは機能しません。「ファイルはプリコンパイルされていないため、要求できません」という行に沿って例外をスローします。

その結果、プリコンパイルを完全に放棄して、サイトのトラフィックが特に高くないため、最初のリクエストのパフォーマンス ヒットを取得することにしました。しかし、ビルド プロセスにすでに組み込まれている Web 配置プロジェクトを使用してこれを行う方法がわかりません。

[アップデート]

これを達成するために Microsoft.WebDeployment.targets ファイルをカスタマイズすることを検討していますが、これまでのところうまくいきませんでした。

[アップデート]

Microsoft.WebDeployment.targets ファイルを調べてみると、Web 配置プロジェクトを Web アプリケーション プリコンパイルから切り離す簡単な方法がないことがわかりました。実際、必要があるかどうかはわかりません。私が代わりに使用しているのは、次のスニペットに似たものです。デバッグビルド用にデプロイしないという条件 attr を使用してプロジェクトファイルに入れました。

<Target Name="AfterBuild">
    <!-- clean output dir -->
    <CreateItem Include="$(output)**\*.*">
        <Output TaskParameter="Include" ItemName="OldFiles"/>
    </CreateItem>
    <Delete ContinueOnError="true"
        TreatErrorsAsWarnings="true" Files="@(OldFiles)"/>
    <!-- copy content -->
    <Copy SourceFiles="@(Content)"
        DestinationFolder="$(output)%(Content.RelativeDir)" />
    <CreateItem Include="$(OutputPath)\*">
        <Output TaskParameter="Include" ItemName="Binaries" />
    </CreateItem>
    <Copy SourceFiles="@(Binaries)" DestinationFolder="$(output)bin" />
    <ReplaceConfigSections RootPath="$(output)"
        WebConfigReplacementFiles="@(ConfigFiles)"
        UseExternalConfigSource="true"
        ValidateSectionElements="true"/>
</Target>

プリコンパイルせずにプロジェクトをデプロイするために必要なことはこれだけのようです。より良いものを見つけたら教えてください。

4

3 に答える 3

2

VirtualPathProviderをプリコンパイルされたWebサイト(またはせいぜい部分的にプリコンパイルされたもの)で機能させるには、このhttp://sunali.com/2008/01/09/virtualpathprovider-in-precompiled-web-sites/に関連してAlconjaが言うことを行う必要があります。

代わりに一般的な「AppInitialize」:

public static void AppInitialize()
{
    HostingEnvironment.RegisterVirtualPathProvider(new MyVirtualPathProvider())
}

これを使って:

public static void AppInitialize()
{
    HostingEnvironment hostingEnvironmentInstance=(HostingEnvironment)typeof(HostingEnvironment).InvokeMember("_theHostingEnvironment",  BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.GetField, null, null, null);

    MethodInfo mi = typeof(HostingEnvironment).GetMethod("RegisterVirtualPathProviderInternal", BindingFlags.NonPublic | BindingFlags.Static);

    mi.Invoke(hostingEnvironmentInstance, new object[] { (VirtualPathProvider)new MyVirtualPathProvider()});
}

参考までに、オリジナルのアクションフィルターはプリコンパイルされたウェブサイトです。通常のRegisterVirtualPathProviderメソッドに加えて、リフレクションを使用して、RegisterVirtualPathProviderInternalをインターセプトする目的を実現できます。

于 2011-05-26T21:51:19.053 に答える
1

何かが足りないかもしれませんが(VirtualPathProvidersの経験はありません)、aspxファイルとascxファイルをプリコンパイルしないようにする場合は、の[コンパイル]セクションの[このプリコンパイルされたサイトを更新可能にする]チェックボックスをオンにします。デプロイメントプロジェクトのプロパティページ(使用している構成に関係なく)。

MSDNから:

このプリコンパイルされたサイトを更新可能にする

.aspxページのコンテンツがアセンブリにコンパイルされないことを指定します。代わりに、マークアップはそのままにして、Webサイトをプリコンパイルした後にHTMLおよびクライアント側の機能を変更できるようにします。このチェックボックスを選択することは、aspnet_compiler.exeコマンドに-uオプションを追加することと同じです。

于 2009-08-11T01:09:38.237 に答える
0

プロジェクト/ソリューション全体を開かずに、Visual Studio で個々の ASPX ファイルを開くだけで、再コンパイルせずに ASPX ファイルを更新することに成功しました。

お役に立てれば。

于 2009-08-11T20:53:08.530 に答える