87

ソリューションで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を設定したタイプを再利用したいのですが、それ以上は使用しません。これをチェックしなくても、引き続きアクセスできますか?

4

13 に答える 13

157

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

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


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

于 2011-05-23T12:49:31.883 に答える
37

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

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

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

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

于 2009-12-10T18:43:56.727 に答える
10

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

インポートできなかった私のクラスには、cutomenumタイプのプロパティがあります。このプロパティはDataMemberとしてマークされ、列挙型も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
}

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

于 2011-05-12T19:30:28.637 に答える
8

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

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

于 2011-12-03T18:24:55.550 に答える
8

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

于 2010-03-16T18:59:24.177 に答える
4

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

幸運を。

于 2012-08-22T13:25:47.017 に答える
3

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

于 2016-04-06T16:09:29.940 に答える
1

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

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

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

于 2014-02-05T01:40:19.977 に答える
0

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

于 2011-08-10T22:17:08.180 に答える
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']

于 2013-07-24T00:02:05.973 に答える
0

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

于 2013-11-21T14:22:39.413 に答える
0

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

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

于 2014-03-11T14:17:38.377 に答える
0

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

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

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

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

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

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

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

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

于 2016-01-15T16:57:27.503 に答える