ソリューションでWCFサービスライブラリプロジェクトを作成し、これへのサービス参照があります。クラスライブラリのサービスを使用しているため、クラスライブラリに加えて、WPFアプリケーションプロジェクトからの参照があります。サービスは簡単にセットアップされます-非同期サービス機能を取得するためにのみ変更されます。
サービス参照を更新するまで、すべてが正常に機能していました。失敗したため、最終的にロールバックして再試行しましたが、それでも失敗しました!そのため、サービス参照の更新は、変更を加えずに失敗します。なぜ?!
私が得るエラーはこれです:
Custom tool error: Failed to generate code for the service reference
'MyServiceReference'. Please check other error and warning messages for details.
この警告は詳細情報を提供します。
Custom tool warning: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension:
System.ServiceModel.Description.DataContractSerializerMessageContractImporter
Error: List of referenced types contains more than one type with data contract name 'Patient' in
namespace 'http://schemas.datacontract.org/2004/07/MyApp.Model'. Need to exclude all but one of the
following types. Only matching types can be valid references:
"MyApp.Dashboard.MyServiceReference.Patient, Medski.Dashboard, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" (matching)
"MyApp.Model.Patient, MyApp.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" (matching)
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:portType[@name='ISomeService']
同様の警告が2つあります。
Custom tool warning: Cannot import wsdl:binding
Detail: There was an error importing a wsdl:portType that the wsdl:binding is dependent on.
XPath to wsdl:portType: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:portType[@name='ISomeService']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='WSHttpBinding_ISomeService']
そして同じ:
Custom tool warning: Cannot import wsdl:port ..
私はこれをすべて紛らわしいと思います。私は、サービス参照を通じて得たものを除いて、クライアント側のダッシュボードに患者クラスを持っていません。それはどういう意味ですか?そして、なぜそれは突然表示されますか?覚えておいてください:私は何も変えませんでした!
さて、これに対する解決策が見つかりました here ですが、これが何を意味するかについての説明はありません。そう;サービスの[サービス参照の構成]で、[参照アセンブリのタイプを再利用する]チェックボックスをオフにします。今すぐ再構築すれば、すべて問題なく動作します。しかし、私は実際に何を変更しましたか?これは私のアプリケーションに影響を与えますか?そして、いつこれをオフにする必要がありますか? DataContractをセットアップした型を再利用したいのですが、それ以上は使いません。これをチェックせずにそれらにアクセスできますか?
サービス参照を追加する場合、サービスで使用されるタイプを処理するには2つの方法があります。
うまくいかないことがたくさんあります。ツールがクラッシュした場合、サービス参照を削除して再起動する方が速い場合があることがわかりました。
サービス参照の使用を停止しました。クライアントとサービスを制御するプロジェクトでは、この screencast で説明されている方法を使用します。
私はここで答えを見つけました: http://www.lukepuplett.com/2010/07/note-to-self-don-let-wcf-svcutil-reuse.html
長い話:詳細メニューから参照アセンブリのタイプを再利用をオフにしました。
これが重要かどうかはわかりませんが、MVCではなくWebフォームを使用しています。
今日もこの問題がありました。私の間違いを見つけるのに丸一日かかりました。それが役に立てば幸い。
インポートできなかった私のクラスには、cutom列挙型プロパティがあります。このプロパティはDataMemberとしてマークされ、EnumはDataContractとしてもマークされます。これまでのところ、すべて順調です。すべての列挙型メンバーをEnumMemberとしてマークするのを忘れました。
だから私は変わった
[DataContract]
public enum SortMethodType
{
Default = 0,
Popularity = 1,
ReleaseDate = 2,
PublishedDate = 3,
TranslatedTitle = 4,
OriginalTitle = 5,
UserRating = 6,
Duration = 7
}
これに:
[DataContract]
public enum SortMethodType
{
[EnumMember]
Default = 0,
[EnumMember]
Popularity = 1,
[EnumMember]
ReleaseDate = 2,
[EnumMember]
PublishedDate = 3,
[EnumMember]
TranslatedTitle = 4,
[EnumMember]
OriginalTitle = 5,
[EnumMember]
UserRating = 6,
[EnumMember]
Duration = 7
}
そして、ついにうまくいきました!
参照を追加しながら詳細プロパティに移動し、チェックリストから「System.Window.Browser」を削除すると、問題が解決します。
それは奇妙に聞こえるかもしれませんが、参照を削除してからVisual Studioを閉じ、再度開き、最後に参照を追加して修正しました。
カスタムツールを再起動する必要があると思います。
別の開発者のマシンで動作している間、私は常にこのエラーに出くわします。私は仮想マシンのどこでも完全な管理者ですが、Visual Studioを閉じ、「管理者として実行」で再度開くと、魔法のように機能しました。
幸運を。
ソリューションをVisual Studio(VS)2010から2013にアップグレードし、各プロジェクトの.NET Frameworkを4から4.5.1に変更すると、警告が表示されました。 VSを閉じて再度開くと、警告は消えました。
「参照アセンブリでの型の再利用」をオフにすると、あいまいな参照で問題が発生する可能性があります。これは、参照.csファイルでこれらのオブジェクトを再度作成するサービス参照が原因であり、サービスを実装するコードが元のネームスペースからそれらを参照している可能性があります。
このシナリオが発生した場合、「指定された参照アセンブリの再利用タイプ」を確認すると便利です。これにより、あいまいな参照のみを持つものを選択でき、問題を迅速に解決できます。
それが他の誰かを助けることを願っています。
サービスに問題がないことが疑わしい場合(enumの問題や、他の人が述べた非シリアル化可能なクラスなど)、新しい参照でnew projectを作成してみてください。
私はSilverlight 5を使用していますが、参照を数回削除して再作成しようとしました。 reference.cs
ファイルは毎回完全に空になっただけで、作成してから文字通り何年も経っていたので、サービスで何が変更されたのかを理解しようとするのは問題外でした。
エラーには2.0.5.0への参照が含まれていることに気付きました。現在、これが実際にSilverlightバージョンに関連するかどうかさえわかりませんが、まったく新しいプロジェクトを作成し、突然すべてが機能することを考えさせられました。
警告2カスタムツールの警告:wsdl:portTypeをインポートできません詳細:WSDLインポート拡張の実行中に例外がスローされました:System.ServiceModel.Description.DataContractSerializerMessageContractImporterエラー:ファイルまたはアセンブリ 'System.Xml、Version = 2.0.5.0、 Culture = neutral、PublicKeyToken = 7cec85d7bea7798e 'またはその依存関係の1つ。システムは、指定されたファイルを見つけることができません。エラーソースへのXPath:// wsdl:definitions [@targetNamespace = '']/wsdl:port Type [@ name = 'IShoppingCart']
私は自分のプロジェクトを見ていましたが、これと同じ問題を抱えていました。 WCFとWebサイトでは同じDLLの異なるバージョンであることが判明しました。WebサイトにはDLLの新しいバージョンがあり、サービスは古いバージョンのDLLを参照し、それらがすべて同期したら、すべて正常に機能しました。
WCFサービスの私のインターフェイスはアセンブリにあり、実装は別のアセンブリにあり、サービス参照はサービス参照のクライアントとは別のさらに別のアセンブリにあります。 DataContractを列挙型に適用した直後にエラーメッセージが表示されました。 EnumMemberを列挙のフィールドに適用すると、問題は解決しました。
将来的には、同じエラーが発生しましたが、バージョンの問題が2つの異なる方法で発生しました。
2つのWCFサービスと、サービス参照を介して通信する2つのクライアントアプリケーションがあります。両側でnugetパッケージを更新し、サービス参照を更新しようとすると、このエラーが発生しました。
削除しても解決しませんでした。 「アセンブリの再利用」のチェックを外すことは、再利用する必要があるため望ましくありません-それが全体のポイントです。
最後に、2つの個別の問題がありました。
1)最初の問題は、ビジュアルスタジオのキャッシュの問題だと思います。私は細心の注意を払ってすべてのリファレンスを調べて問題を発見しませんでしたが、以前のバージョンのファイルが見つからないと報告しました。すべてのNugetパッケージをアンインストールし、Visual Studioを再起動して、再インストールしました。サービス参照の更新は機能しました。
2)2番目の問題は、依存関係の問題が原因でした。両側のnugetパッケージを更新し、すべてが正しく見えたが、マークされていない依存関係が同期していませんでした。例:
Package Foo v1はBar v1を参照します。参照を更新せずに、FooとBarを個別にv2に更新することができます。 FooとBar v2の両方をインストールすると、サービス参照ツールはFoo v2をスキャンし、Bar v1への参照を参照し、古いバージョンが見つからないため失敗します。これは、すべてのパッケージのdllのバージョン番号を更新した場合にのみ正しく報告されます。 Visual StudioとMSBuildでは、アプリケーションの構築に問題はありませんが、サービス参照ではすべてを解決しようとするのにひどい時間がかかります。
これが誰かの助けになることを願っています。
同じエラーが発生しました。何が間違っていたのかを見つけようとしてほぼ1日苦労しました。私にとっての手がかりは、VSが投げていたという警告でした。 Yahoo.Yui.Compressor.dllに何らかのマッピングをしようとしていました。これは、数日前に追加および削除したライブラリ(使用しないことに決めたため)です。ライブラリがなかったので衝撃的でしたが、どういうわけかそれを参照しようとしていました。
最後に、このDLLをゴミ箱から復元すると、サービス参照を正常に更新できました。