webdevqa.jp.net

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

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動作拡張要素タイプが見つからないのはなぜですか?

更新/説明:

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

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

47
Travis Illig

回避策 に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を提供します。

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

21
Travis Illig

私はちょうど使用しました

[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. THIS IS間違っています!!!

だから、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.を正しい番号に置き換えます。

8
Developer

最近この問題に出くわした人へのFYIとして、考えられる解決策はapp.config/web.configでアセンブリを完全に修飾することです。 EG

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

try-必要に応じて値を置き換えます

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

この特定のソリューションは私のために働いた。

6
cdmdotnet

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

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

4
Derek Atlansky

ここに私のために働いたステップのリストがあります:

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

すべて一緒にのみ

2
abatishchev

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

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

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

2
James Bender

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

1
Joe

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

0

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

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

0
Ryan

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

0
jrmack