このWCFエラーの意味:「カスタムツールの警告:wsdl:portTypeをインポートできません」


84

ソリューションで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 .. 

これはすべて紛らわしいと思います。サービスリファレンスから取得したものを除いて、クライアント側のダッシュボードにPatientクラスがありません。では、それはどういう意味ですか?そして、なぜそれが突然表示されるのですか?覚えておいてください:私は何も変更しませんでした!

さて、これに対する解決策はここにありましたが、これが何を意味するのかについての説明はありません。そう; サービスの[サービス参照の構成]で、[参照されるアセンブリのタイプを再利用する]チェックボックスをオフにします。今すぐ再構築すると、すべて問題なく正常に動作します。しかし、私は本当に何を変えましたか?これは私のアプリケーションに影響を与えますか?そして、いつこれをオフにする必要がありますか?DataContractを設定したタイプを再利用したいのですが、それ以上は使用しません。これをチェックしなくても、引き続きアクセスできますか?


わかりました。msdn(msdn.microsoft.com/en-us/library/bb628653.aspx)に簡単な説明があります。しかし、誰かがより良い説明を持っていますか?これは、私が設定したDataContractをどのように参照しますか?
stiank81 2009

回答:


37

サービス参照を追加する場合、サービスで使用されるタイプを処理する方法は2つあります。

  • タイプはdllに格納され、そのdllはクライアントとサーバーアプリケーションの両方から参照されます。
  • タイプは、クライアントによって参照されるdllにありません。その場合、サービス参照を作成するツールは、references.csファイルに型を作成します。

うまくいかないことがたくさんあります。ツールがクラッシュした場合、サービス参照を削除して再開する方が速い場合があることがわかりました。

サービスリファレンスの使用を停止しました。クライアントとサービスを制御できるプロジェクトの場合、このスクリーンキャストで説明されている方法を使用します。


2
ありがとう!私は実際に昨日そのスクリーンキャストを見つけました。それを見て、それは本当に目を見張るものでした!基本が整ったら、その構造に移行することを計画しています。あなたは私が見ているのと同じ問題のいくつかに苦しんでいるようですね。何かがおかしなことに問題が発生したときに、サービス参照を削除して再読み込みすることがよくありますが、それは良い兆候ではありません。説明されているアーキテクチャが役立つことを願っています。
stiank81 2009

Silverlight 5でPollingDuplexバインディングを使用しているときに、誰かがWebサービスを手動で作成できましたか?
リチャードB

157

私はここで私の答えを見つけました:http//www.lukepuplett.com/2010/07/note-to-self-don-let-wcf-svcutil-reuse.html

簡単に言うと、[詳細設定]メニューから[参照アセンブリの再利用タイプ]のチェックを外しました


これが重要かどうかはわかりませんが、MVCではなくWebフォームを使用しています。


2
VS 2012の再起動も必要です
George Filippakos 2013

見たいと思っていますが、リンクが
Chris

1
VS2013のMVC3プロジェクトで動作します(再起動は必要ありません)。
Pawel Krakowiak

5
+ 1-参照用:この変更を行うには、それを使用するプロジェクトのサービス参照を右クリックし、[サービス参照の構成...]を選択します
GrandMasterFlush 2014年

2
「短編小説」ほど良いものはありません:)
ロン

9

私も今日この問題を抱えていました。間違いを見つけるのに丸一日かかりました。それが役に立てば幸い。

インポートできなかったクラスには、cutomenumタイプのプロパティがあります。このプロパティは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
}

そしてついにうまくいきました!


8

参照を追加しながら詳細プロパティに移動し、チェックリストから「System.Window.Browser」を削除します。これで問題が解決します。


どうも!サービス参照を使用しなくなりました-@ Shirazによる回答のスクリーンキャストに記載されている手動のアプローチを実行します。しかし、これはとにかく知っておくといいです!
stiank81 2010年

8

奇妙に聞こえるかもしれませんが、参照を削除してからVisual Studioを閉じ、再度開いて、最後に参照を再度追加することで修正しました。

カスタムツールのことは再起動する必要があると思います。


2
参照を削除せずに問題を解決しようと決心した場合でも、新しいプロジェクトを作成し、参照を追加して、それが機能するかどうかを確認することを強くお勧めします。これにより、既存のプロジェクトには見られないエラーが明らかになるか、
正常に機能

4

別の開発者のマシンで動作している間、私は常にこのエラーに遭遇します。私は仮想マシンのどこでも完全な管理者ですが、Visual Studioを閉じて、[管理者として実行]で再度開くと、魔法のように機能しました。

幸運を。


2

ソリューションをVisualStudio(VS)2010から2013にアップグレードし、各プロジェクトの.NET Frameworkを4から4.5.1に変更した後、警告が表示されました。VSを閉じて再度開くと、警告が消えました。


これは役に立ちましたが、.NET4.5.2から4.6Gaaに変更しました。
Jimenemex

1

「参照されるアセンブリの再利用タイプ」をオフにすることの1つの欠点は、あいまいな参照で問題が発生する可能性があることです。これは、サービス参照がこれらのオブジェクトを参照.csファイルに再度作成するためであり、サービスを実装するコードが元の名前空間からそれらを参照している可能性があります。

このシナリオが発生した場合、「指定された参照アセンブリの再利用タイプ」を確認すると、参照があいまいなものだけを選択できるので、問題がすぐに解決されます。

それが他の誰かを助けることを願っています。


0

WCFサービスのインターフェイスはアセンブリ内にあり、実装は別のアセンブリ内にあり、サービス参照はサービス参照のクライアントとは別の別のアセンブリ内にあります。DataContractを列挙型に適用した直後にエラーメッセージが表示されました。列挙型のフィールドにEnumMemberを適用した後、問題は解決しました。


0

サービスに問題がないかどうか疑わしい場合(列挙型の問題、または他の人が言及したシリアル化できないクラスなど)、新しい参照を使用して新しいプロジェクトを作成してみてください。

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']


0

私は自分のプロジェクトを見ていましたが、これと同じ問題が発生していました。WCFとWebサイトで同じDLLの異なるバージョンであることが判明しました。Webサイトには新しいバージョンのDLLがあり、サービスは古いバージョンのDLLを参照していました。それらがすべて同期すると、すべてうまく機能しました。


0

同じエラーが発生しました。私は何が悪いのかを見つけようとしてほぼ1日苦労しました。私にとっての手がかりは、VSが投げていた警告でした。数日前に追加および削除した(使用しないことにしたため)ライブラリであるYahoo.Yui.Compressor.dllに何らかのマッピングを行おうとしていました。図書館がなかったので衝撃的でしたが、どういうわけかそれを参照しようとしていました。

最後に、このdllをゴミ箱から復元すると、サービス参照を正常に更新できます。


0

将来ここにいる人にとっては、同じエラーが発生しましたが、バージョンの問題が原因で、2つの異なる方法がありました。

2つのWCFサービスと、サービス参照を介して通信する2つのクライアントアプリケーションがあります。両側のnugetパッケージを更新し、サービス参照を更新しようとすると、このエラーが発生しました。

削除しても役に立ちませんでした。「アセンブリの再利用」のチェックを外すことは、再利用する必要があるため望ましくありません。それが要点です。

結局、2つの別々の問題がありました:

1)最初の問題は、VisualStudioのキャッシュの問題だったと思います。すべての参照を注意深く調べたところ、問題は見つかりませんでしたが、それでも以前のバージョンのファイルが見つからないと報告されました。すべてのnugetパッケージをアンインストールし、Visual Studioを再起動して、再インストールしました。サービス参照の更新が機能しました。

2)2番目の問題は、依存関係の問題が原因で発生しました。両側のnugetパッケージを更新したところ、すべてが正しいように見えましたが、マークされていない依存関係が同期していませんでした。例:

パッケージFoov1はBarv1を参照します。参照を更新せずに、FooとBarを個別にv2に更新することができます。FooとBarv2の両方をインストールすると、サービス参照ツールはFoo v2をスキャンします。Barv1への参照を参照してください。古いバージョンが見つからないため、失敗します。これは、すべてのパッケージのdllのバージョン番号を更新した場合にのみ正しく報告されます。Visual StudioとMSBuildはアプリケーションのビルドに問題はありませんが、サービス参照はすべてを解決しようとしてひどい時間を費やします。

これが誰かに役立つことを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.