1

複数の WAP ( Web アプリケーション プロジェクト)を含むソリューションがあります。これらのサイトをプリコンパイルできるように、
すべての WAP には独自のWeb 配置プロジェクトがあります。Web アプリの 1 つで、新しい WCF ファイルを作成します。

AspNetCompatibilityRequirementsMode.Allowed

デバッグモードでは正常に動作していますが、リリースに切り替えるとクラッシュします:
(展開可能なバージョンを作成するために msbuild を使用しています)

ファイルまたはアセンブリ 'App_Web_*****、Version=0.0.0.0、Culture=neutral、PublicKeyToken=null' またはその依存関係の 1 つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。

このリンクで説明を見つけました:WCFサービス

WCF は、App_Global を含む、参照されたアセンブリのリストをビルド結果 (service.svc.cdcab7d2.compiled) の customString 属性に格納します。ここでは、これらのアセンブリが常に存在するという誤った前提があるようです。これは、アセンブリがマージされる Web 配置プロジェクト (aspnet_merge) では必ずしもそうではありません。マージ手順の後、WDP でそのオプションを選択したため、アセンブリは実際にはすべて 1 つのアセンブリ (MyWebSite.dll としましょう) にマージされます。ASP.NET は、認識している .compiled ファイルのみを更新するため、App_Global.asax.compiled は実際には、App_Global.dll ではなく MyWebSite_Deploy.dll への正しい参照を持っています。元のアセンブリは、マージ ステップの後に削除されます。WCF は、以前に保存されたアセンブリのリストを読み取り、App_Global が見つからない場合にスローします

私が試した解決策のリスト:

1.「このプリコンパイル済みサイトを更新可能にする」にチェックを入れます - 機能しません

2. service.compile ファイルから手動で App_* 参照を削除
します (これは機能しましたが、別の解決策になるはずです)。

3.サービス/ファクトリの完全修飾名を .svc に追加
する サービスには完全修飾名があります。

4.このキーを設定しようとしました:
<SourceWebPhysicalPath>..\..\ProjectName</SourceWebPhysicalPath>

これらの指示に従って

5.<compilation debug="false" batch="false">

これらの手順を使用して、これをweb.configに設定しようとしました

6.「すべての出力を単一のアセンブリにマージする
これは試していません。使用されているすべてのアセンブリを GAC に登録する必要があり、展開ロジックを変更する必要があるためです。

アプリケーションが停止し、容認できないため、asp.net 一時フォルダーを削除したくありません。

Scott Gutthrie リンクも見つけましたが、それは '07 年のもので、asp.net 4.0 に移行する必要があります。

追加情報

サービスが配置されています:
ProjectName\WebResorce\Service.svc

<%@ ServiceHost ... Factory="SolutionName.SharedWeb.WadoLabsServiceHostFactory" %>

ここで、SharedWebは共有 Web プロジェクト

です 他にアイデアはありますか?
前もって感謝します

4

2 に答える 2

1

同じソリューション内の別のライブラリ プロジェクトに WCF サービスを実装し、単に Web アプリからそのプロジェクトを参照しないのはなぜですか? そうすれば、それらはプリコンパイル プロセスから除外され、*.svc ファイル内で予測可能な型名を使用できます。さらに、これにより、よりクリーンなソリューション構造も得られるでしょう。

于 2011-08-04T18:05:11.010 に答える