Windowsサービスソリューションがあり、VS2010でHermes(Opensource ebmsメッセージサーバー)Webサービスにサービス参照を追加しようとしています。
URLを使用してWebサービスを見つけることはできますが、サービス参照を設定しようとすると、Visual Studioで次のエラーが発生します。
Error 8 Custom tool error: Failed to generate code for the service reference 'testService'. Please check other error and warning messages for details. C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler
Warning 6 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://service.ebms.edi.cecid.hku.hk/']/wsdl:portType[@name='EbmsStatusQuery']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:binding[@name='EbmsSoapHttpStatusQuery'] C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler
Warning 7 Custom tool warning: Cannot import wsdl:port
Detail: There was an error importing a wsdl:binding that the wsdl:port is dependent on.
XPath to wsdl:binding: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:binding[@name='EbmsSoapHttpStatusQuery']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:service[@name='EbmsMessageStatusQuery']/wsdl:port[@name='EbmsStatusQuery'] C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler
Warning 5 Custom tool warning: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.XmlSerializerMessageContractImporter
Error: Schema with target namespace 'http://service.ebms.edi.cecid.hku.hk/' could not be found.
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://service.ebms.edi.cecid.hku.hk/']/wsdl:portType[@name='EbmsStatusQuery'] C:\Users\Admin\documents\visual studio 2010\Projects\MyProject\MyProject.MessageHandler\Service References\testService\Reference.svcmap 1 1 MyProject.MessageHandler
調査の結果、ディレクトリ(おそらくc:\ windows\temp)へのアクセス許可がないためにsvcutil.exeがプロキシを構築できなかったことが原因であることが示唆されたようです。さまざまなアクセス許可を割り当てようとしましたが、どのユーザーが許可を必要としているのか、それともただのニシンなのか本当にわかりません。
どんなアイデアでも大歓迎です。
ありがとう
[サービス参照の構成]オプションから、すべての参照アセンブリの[再利用タイプ]をオフにする必要があります。
サービス参照を右クリックし、Configure Service Reference...
を選択します
次に、Reuse types in referenced assemblies
のチェックを外します
OK
をクリックし、ソリューションを削除して再構築します。
Visual Studio 2012を使用してASP .Net MVC 4.0プロジェクトからWebサービスのクライアントを生成しようとしたときにも、同様のエラーが発生しました。
問題の原因は、私がクライアントを生成しようとしたプロジェクトが、参照されていない別のアセンブリに依存しているアセンブリを参照しているという事実にあるようです。
サービス構成で「参照アセンブリのタイプを再利用」が有効になっている場合、サービスジェネレーターはおそらくすべての参照アセンブリを検査して、再利用できるタイプのリストを取得しています。参照されたアセンブリの1つが利用できない別のアセンブリを参照しているという事実は、おそらくジェネレーターが失敗する原因になっています。
サービス構成から「参照アセンブリのタイプを再利用する」のチェックを外します上記の問題を解決します。ただし、副作用があります。 理由のために再利用タイプのオプションがありますそして、場合によっては、サービスを消費するコードで不必要なキャストを避けます。
たとえば、サービス自体がWCFを使用して構築され、その中の一部のメソッドパラメーターがSystem.Guid型である場合、再利用型オプションが無効になっていると、生成されたクライアントで文字列に変換されます。
私が好む代替案型の再利用を無効にすることは、その目的のために特別に作成されたクラスライブラリプロジェクトからサービス参照を追加することです。留意すべきことの1つは、クラスライブラリのapp.configからスタートアッププロジェクトの構成ファイルにすべてのサービス関連の構成をコピーすることです。
サービスクライアントで再利用する必要があるローカルアセンブリで定義された型がある場合、それらのアセンブリは、すべての依存関係と共に、上記のクラスライブラリプロジェクトから参照する必要があります。
上記の記事に感謝します。
私の場合、VS.Net 2008のWPFプロジェクトでこの問題が発生しました。この記事を読んだ後、Webサービスで使用されるアセンブリがクライアントで使用されるアセンブリの異なるバージョンであることに気付きました。
クライアントでアセンブリを更新した後、正常に動作します。
WSDLのエラーとWSDLを調べることなく、これ以上コメントすることはできません。WSDLを共有できる場合は、そうしてください。のため、問題を推測することは非常に困難です。 =
私が言えることは、WSDLにスキーマが欠落しているように見えるということだけです(ターゲット名前空間「http://service.ebms.edi.cecid.hku.hk/」)。 include命令が無視される場合のスキーマの問題と異なる処理について知っています。
一般に、MicrosoftのWebサービスの実装は非常に優れていることがわかっているので、Webサービスは危険なWSDLを送信していると思います。
アセンブリ再利用チェックボックスのチェックを外さずにこれを修正したい場合、これが私にとってうまくいったものです:
上記のように、考えられるいくつかの異なる問題があります。私たちが発見したのは、WCFライブラリの.DLLがクライアントプロジェクトへの参照として追加されたことです。これにより、オブジェクトの解決に問題が発生し、コード生成ステップによってファイルが「空」になりました。 「タイプの再利用...」の使用をオフにすると答えのように見えますが、実際のタイプのプロキシであるオブジェクトタイプの追加の定義を新しい名前空間に作成します。それらのタイプの使用。このオプションをチェックするのは、本当にタイプを「非表示」にしたい場合だけです。
「DLL」タイプの依存関係を、別のプロジェクトから分離しようとしているプロジェクトに「リーク」させたくない場合は、タイプを非表示にすることが適切です。 WCFライブラリプロジェクトのDLLがクライアントプロジェクト参照に忍び込んでいる場合、タイプ定義もDLLにあるため、この問題はあらゆる種類の奇妙な副作用で発生します。
管理者モードでVisual Studioを実行することで解決される同じ問題に直面する
Silverlight 5(VS2012)でも同じエラーが発生します
以下への参照を削除することもできます。
サービス参照を更新した後、それらを再度追加してください。
Visual Studioを再起動するとうまくいきました。 VS 2015を使用しています。
このエラーが発生した場合、「再利用タイプ」が常に問題とは限りません。
古いサービスに参照を追加する場合、「詳細」をクリックして、「Web参照を追加」をクリックします。ここでwsdlにリンクすると、すべてが機能するはずです。
VS2015 ProfessionalでVS2010 WCF + Silverlightソリューションをアップグレードするの場合、この問題が発生しました。 Silverlight 4からSilverlight 5への自動アップグレードに加えて、サービス参照の再利用チェックボックスの値が変更され、生成に失敗しました。
サービス参照を更新しようとしたときにこの問題が発生しました(ただし、サービス参照を追加するときにのみエラーが表示されます)が、アセンブリ再利用チェックボックスを削除したくありませんでした。
私のために働いたのは次のことでした:
Voila、今では実際に更新され、生成されたコードをすべて削除しようとしません。
タイプの再利用機能をあきらめる準備がほぼ整いました...