1. ホーム
  2. wpf

[解決済み] このWCFのエラーは何を意味するのでしょうか。"カスタムツールの警告。Cannot import wsdl:portType" です。

2023-04-19 11:09:08

質問

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

私はこれをすべて理解することはできません... クライアント側のDashboardには、サービスリファレンスから取得したもの以外にPatientクラスがありません。これは何を意味するのでしょうか? また、なぜ突然表示されるのでしょうか?覚えておいてください: 私は何も変更していません!

さて、これの解決策が見つかりました ここで が見つかりましたが、これが何を意味するのかの説明はありませんでした。そこで、サービスの "Configure service reference" で、 "Reuse types in the referenced assemblies" のチェックボックスをオフにしました。これでリビルドすると、すべて問題なく動作するようになりました。しかし、私は実際に何を変更したのでしょうか?これは私のアプリケーションに影響を与えるのでしょうか?また、どのような場合にこのチェックを外すべきでしょうか?私はDataContractをセットアップした型を再利用したいのですが、それ以上はできません。これをチェックしなくても、私はまだそれらにアクセスできるのでしょうか?

どのように解決するのですか?

サービスリファレンスを追加する際、そのサービスで使用される型は2つの方法で処理することができます。

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

うまくいかないことがたくさんあります。私たちは、ツールがクラッシュした場合、サービス参照を削除してもう一度やり直した方が速い場合があることを発見しました。

私たちはサービス リファレンスを使用するのをやめました。クライアントとサービスを制御しているプロジェクトでは、次のような方法を使用しています。 スクリーンキャスト .