49

2 つのプロジェクトを含むソリューションがあります。1 つのプロジェクトは ASP.NET Web アプリケーション プロジェクトで、もう 1 つはクラス ライブラリです。Web アプリケーションには、クラス ライブラリへのプロジェクト参照があります。これらはどちらも厳密な名前ではありません。

「フレームワーク」と呼ぶクラス ライブラリには、エンドポイント動作 (IEndpointBehavior の実装) と構成要素 (BehaviorExtensionsElement から派生したクラス) があります。構成要素は、構成を介してエンドポイントの動作をサービスにアタッチできるようにするためのものです。

Web アプリケーションには、AJAX 対応の WCF サービスがあります。web.config では、カスタム動作を使用するように AJAX サービスを構成しています。構成の system.serviceModel セクションは非常に標準的で、次のようになります。

<system.serviceModel>
 <behaviors>
  <endpointBehaviors>
   <behavior name="MyEndpointBehavior">
    <enableWebScript />
    <customEndpointBehavior />
   </behavior>
  </endpointBehaviors>
 </behaviors>
 <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
 <services>
 <service name="WebSite.AjaxService">
  <endpoint
           address=""
           behaviorConfiguration="MyEndpointBehavior"
           binding="webHttpBinding"
           contract="WebSite.AjaxService" />
  </service>
 </services>
 <extensions>
  <behaviorExtensions>
   <add
       name="customEndpointBehavior"
       type="Framework.MyBehaviorExtensionsElement, Framework, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
  </behaviorExtensions>
 </extensions>
</system.serviceModel>

実行時には、これは完全に機能します。AJAX 対応の WCF サービスは、カスタム構成されたエンドポイントの動作を正しく使用します。

問題は、新しい AJAX WCF サービスを追加しようとしたときです。[追加] -> [新しい項目...] を選択して [AJAX 対応の WCF サービス] を選択すると、.svc ファイルと分離コードが追加されるのを見ることができますが、web.config ファイルを更新しようとすると、次のエラーが発生します。

構成ファイルは、WCF サービス ライブラリの有効な構成ファイルではありません。

拡張機能「customEndpointBehavior」に登録されたタイプ「Framework.MyBehaviorExtensionsElement、Framework、Version=1.0.0.0、Culture=neutral、PublicKeyToken=null」をロードできませんでした。

明らかに、構成は実行時に完全に機能するため、完全に有効です。動作構成から要素を一時的に削除してから、AJAX 対応の WCF サービスを追加すると、すべて問題なく実行されます。

残念ながら、さまざまな構成の複数のサービスが存在する大規模なプロジェクトでは、すべてのカスタム動作を一時的に削除するとエラーが発生しやすくなります。ウィザードを使用せずにすべてを手動で行うことができることはわかっていますが、誰もができるわけではありません。ウィザードとすべてを使用することを意図したとおりに製品を使用できると便利です.

カスタム WCF 動作拡張要素の型が見つからないのはなぜですか?

更新/説明:

  • 設計時ではなく、実行時に機能します。
  • サービスを追加しようとすると、Framework アセンブリが Web プロジェクトの bin フォルダーにあります。
  • サービスを手動で (「構成なしで」) 追加することはできますが、すぐに使用できる項目テンプレートが機能する必要があります。それが質問の全体的な目標です。
  • この問題は、Visual Studio 2008 で見られます。VS 2010 では、これは解決されているようです。

この問題を Microsoft Connect に提出したところ、カスタム構成要素を GAC に配置するか、IDE フォルダーに配置する必要があることがわかりました。少なくとも今のところ、彼らはそれを修正しません。この質問に対する「回答」として提供された回避策を投稿しました。

4

11 に答える 11

22

私が提出したConnectの問題について Microsoft が投稿した回避策によると、これは既知の問題であり、少なくとも現在のリリースでは解決策はありません。

新しいサービス アイテムの追加に失敗する理由: 新しいアイテムを追加して構成ファイルを更新すると、システムは構成ファイルを読み込もうとするため、この構成ファイルで cusom 拡張機能のアセンブリを検索して読み込もうとします。アセンブリが GAC されているか、vs exe と同じパス (Program Files\Microsoft Visual Studio 9.0\Common7\IDE) にある場合にのみ、システムはそれを見つけることができます。そうしないと、エラー ダイアログが表示され、「新しい項目の追加」が失敗します。

私はあなたの痛みのポイントを理解しています。残念ながら、現在のリリースではこの変更を行うことができません。今後のリリースで調査し、顧客がパスを指定できるようにするための参照ダイアログを提供したり、解決策の回避策を示すためのより良いエラー メッセージを提供したりするなど、より良い解決策を提供するよう努めます。

現在の段階で回避策を試すことができますか: カスタム拡張アセンブリを GAC にするか、それを "Program Files\Microsoft Visual Studio 9.0\Common7\IDE" にコピーしますか?

同じ問題が発生する可能性のある他のお客様を支援するために、Readme を提供します。

残念ながら、私はこれで運が悪いようです。

于 2009-01-14T15:54:44.057 に答える
8

最近これに出くわした人への参考として、考えられる解決策は、app.config/web.config でアセンブリを完全に修飾することです。あなたが持っていた場合EG

<system.serviceModel>
    <extensions>
        <behaviorExtensions>
            <add name="clientCredential" type="Client.ClientCredentialElement, Client" />
        </behaviorExtensions>
    </extensions>

試してください - 必要に応じて値を置き換えてください

<system.serviceModel>
    <extensions>
        <behaviorExtensions>
            <add name="clientCredential" type="Client.ClientCredentialElement, Client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
        </behaviorExtensions>
    </extensions>

この特定のソリューションは私にとってはうまくいきました。

于 2010-07-26T04:08:28.733 に答える
8

ちょうど使った

[assembly: AssemblyVersion("1.0.*")]
//[assembly: AssemblyVersion("1.0.0.0")]
//[assembly: AssemblyFileVersion("1.0.0.0")] 

そのため、毎回新しいアセンブリ ビルド番号を取得しています。

しかし、私たちは持っています

   <add name="clientCredential" type="Client.ClientCredentialElement, Client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />

ここでVersion=1.0.0.0 これは間違っています!!!

したがって、2つのオプションがあります

  1. 戻る

    //[assembly: AssemblyVersion("1.0.*")] 
    [assembly: AssemblyVersion("1.0.0.0")]  Keep it manually.
    [assembly: AssemblyFileVersion("1.0.0.0")] 
    
  2. ビルドごとに手動でVersion=1.0.0.0を正しい番号に置き換えます。

于 2012-05-24T13:38:51.563 に答える
4

特定のプロジェクト/構成ではなく、まったく同じ問題があることを確認するためだけに、新しいプロジェクトでこれを試しました。

Fusion ログを使用すると、システムは動作拡張機能を IDE ディレクトリ (C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE) でのみ検索するようです。ビルド後のステップでアセンブリをこのディレクトリにコピーすることはできますが、見苦しくなります。

于 2008-10-20T18:11:28.087 に答える
2

これが私のために働いたステップのリストです:

  • dllをGACにインストールします。つまり、gacutil / i Bla.dll
  • dllのFQN、つまりgacutil /lBlaを取得します
  • 結果のFQNをWeb.configにコピーします
  • VSに新しいサービスを追加する
  • GACからdllをアンインストールします。つまり、gacutil / u Bla

すべて一緒にのみ

于 2012-12-29T08:34:35.523 に答える
2

Web プロジェクトの bin ディレクトリに、カスタム動作を含む Framework.dll のコピーがありますか? そうでない場合は、おそらく問題です。Visual Studio は動作の実装を探しています。構成にリストされているため、他のプロジェクトを調べるとは考えていません。ビンでアセンブリを見つけることを期待しています。

プロジェクトのセットアップ方法によっては、このアセンブリをビンに入れなくてもデバッグで実行できる場合がありますが、VS は通常ビルドしてそこに置きます。しかし、繰り返しになりますが、それは物事がどのようにセットアップされているかによって異なります。

とにかく、アセンブリが設計時に利用可能であることを再確認したいだけかもしれません。

于 2008-10-04T20:56:49.133 に答える
1

アセンブリをGACに入れるとおそらく役立つでしょうが、これがあなたが探している答えではないことを感謝します. GAC と devenv.exe を含むディレクトリ以外に、VS がアセンブリを探す場所がわかりません。

于 2008-10-07T20:27:28.723 に答える
0

カスタム拡張を使用した要素、要素、および要素を含む web.config の関連セクションをコメントアウトすることで、これを解決しました。

その後、プロジェクトに WCF サービスを追加し、web.config に行を追加して、プロジェクトを公開することができました。

于 2013-08-09T21:29:51.697 に答える
0

フレームワーク 3.5 を使用している場合、Culture=neutral in small ではなく Culture=Neutral in CAPITAL

于 2014-01-14T20:17:01.083 に答える
0

サービス クラスと同じプロジェクト (dll) 内に拡張クラスがあり、それを機能させることができませんでした。別のプロジェクトに移動し、サービス プロジェクトから参照すると、機能しました。他の誰かがこの問題に遭遇した場合に備えて。

于 2014-09-25T13:46:16.467 に答える