WCFサービス参照を追加すると、空の参照が生成されることがあります。


159

WCFサービス参照を追加すると、空のreference.csが生成され、プロジェクト内のどこからでもサービスを参照できなくなります。

誰かがこれに遭遇しましたか?

回答:


377

一般に、それはコード生成の問題であることがわかり、ほとんどの場合、解決できないタイプ名の競合があるためです。

サービス参照を右クリックして[構成]をクリックし、[ 参照アセンブリでのタイプの再利用 ]をオフに すると、問題が解決する可能性があります。

この機能の一部を使用していた場合は、名前がクリーンアップされていることを確認する必要がある場合があります。


5
それが起こったとき、コレクションの種類をObjectModel.ObservableCollectionからGeneric.Listに変更する必要があることもわかりました
Yossi Dahan

2
部分クラスに追加したので、私に起こりました。
マコトサン2012年

2
しかし、あなたがアセンブリの特定のタイプを使用したい場合は、あなただけのそのアセンブリを選択することができますし、それは(少なくとも私の場合には)同じようにうまく動作し、TA
Dead.Rabit

26
6年後も、この質問から1週間に平均50ポイントがもらえることは心に浮かびます。MSに来て、これを修正してください。少なくとも、開発者が空のファイルを見つめるのではなく、うまくいかない場合は、開発者にフィードバックを提供してください。
アンダーソン・イメス、

1
9年経っても、あなたはまだ手伝っています。ありがとうございました!
パラメータ、

38

受け入れられた回答が指摘しているように、型を再利用するときの型参照の問題はおそらく原因です。問題を簡単に特定できない場合、svcutil.exeコマンドラインを使用すると、根本的な問題を明らかにするのに役立ちます(John Saundersが指摘)。

ここでの拡張として、svcutilを使用した簡単な例を示します。

svcutil /t:code https://secure.myserver.com/services/MyService.svc /d:test /r:"C:\MyCode\MyAssembly\bin\debug\MyAssembly.dll"

どこ:

  • / t:codeは、指定されたURLからコードを生成します
  • / d:出力のディレクトリを指定します
  • / r:参照アセンブリを指定する

ここでの完全なsvcutilコマンドラインリファレンス:http ://msdn.microsoft.com/en-us/library/aa347733.aspx

svcutilを実行すると、インポートによって例外がスローされていることがわかります。タイプの1つについて「このタイプのメッセージが表示される場合があります。「参照されたタイプは、インポートされたDataContractと一致しないため、使用できません。」

これは、サービスのDataContractで生成されたものと、参照されたアセンブリのタイプの1つが異なるという点で、単に指定されたとおりである可能性があります。私の場合、インポートしていたサービスには、共有アセンブリにあるものよりも新しい、更新された型がありました。例外で言及されているタイプは同じであるように見えたため、これはすぐにはわかりませんでした。違いは、型で使用されるネストされた複合型の1つでした。

このタイプの例外を引き起こし、結果として空白のreference.csを引き起こす可能性のある他のより複雑なシナリオがあります。一例を示します。

この問題が発生していて、データコントラクトでジェネリック型を使用していない場合、またはIsReference = trueを使用していない場合は、クライアントとサーバーで共有型がまったく同じであることを確認することをお勧めします。そうしないと、この問題が発生する可能性があります。


私の場合、これは、WCFサービスも参照するアセンブリを参照した後に発生しました。アセンブリのリストからそのアセンブリを削除して、タイプを共有し、修正します。
xr280xr 2013年

サービス参照を追加すると、意味のないエラーメッセージ(名前空間のみ)が表示され、問題が指摘されました。
bcampolo 2016年

12

これが発生した場合は、[エラー]ウィンドウと[出力]ウィンドウを調べて、エラーメッセージがないかどうかを確認します。svcutil.exeそれでも問題が解決しない場合は、手動で実行してみて、エラーメッセージがないか確認してください。


@ svcutil.exeを実行するには?手伝って頂けますか ?
Arul Sidthan 2015

@Arul:Googleを使用してsvcutil.exeに関する情報を検索します。
John Saunders、

2
Microsoftがこの投稿を読んだかどうかはわかりませんが、エラーと警告を単にメッセージボックスに表示するだけで(単に私の場合は最小化して)エラーリストウィンドウに表示するのではなく、Googleにアクセスする必要はありませんでした。この。あるいは、新しい警告/エラーが発生したときにタブを赤または黄色で表示すると便利だと思いますか?
jrh 2017年

12

私はこの正確な問題に丸一日頭を打ちました。修正しました。ここに方法があります...

サービス SSL経由で実行する必要がありました(つまり、https://mydomain.com/MyService.svcにあります

開発サーバー上のWCFサービスへのサービス参照の追加は問題なく機能しました。

WCFサービスのまったく同じビルドをライブの運用サーバーに展開し、クライアントアプリケーションに切り替えて、ライブサービスをポイントするようにサービス参照を構成すると、エラーは表示されませんでしたが、アプリはビルドされませんでした。サービス参照がReference.csファイルは完全に空でした!サービス参照を更新しても違いはありませんでした。ソリューションのクリーニングは役に立ちませんでした。VS2010を再起動しても違いはありませんでした。新しい空のソリューションを作成し、コンソールプロジェクトを開始して、サービス参照をライブサービスに追加しても、まったく同じ問題が発生しました。

型の競合などが原因であるとは思いませんでしたが、なんと言っても、「参照されているすべてのアセンブリで型を再利用する」のチェックを外してWCFサービス参照を再構成しました。喜びはありません。チェックマークを元に戻しました。

次のステップは、参照URLでsvcutilを試して、問題の発見に役立つかどうかを確認することでした。コマンドは次のとおりです。

svcutil /t:code https://mydomain.com/MyService.svc /d:D:\test

これにより、以下が生成されました。

Microsoft (R) Service Model Metadata Tool
[Microsoft (R) Windows (R) Communication Foundation, Version 4.0.30319.1]
Copyright (c) Microsoft Corporation.  All rights reserved.

Attempting to download metadata from 'https://mydomain.com/MyService.svc' using WS-Metadata Exchange or DISCO.
Error: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.DataContractSerializerMessageContractImporter
Error: Schema with target namespace 'http://mynamespace.com//' could not be found.
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://mynamespace.com//']/wsdl:portType[@name='IMyService']


Error: 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://mynamespace.com//']/wsdl:portType[@name='IMyService']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='WSHttpBinding_IMyService']


Error: 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://tempuri.org/']/wsdl:binding[@name='WSHttpBinding_IMyService']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:service[@name='MyService']/wsdl:port[@name='WSHttpBinding_IMyService']


Generating files...
Warning: No code was generated.
If you were trying to generate a client, this could be because the metadata documents did not contain any valid contracts or services
or because all contracts/services were discovered to exist in /reference assemblies. Verify that you passed all the metadata documents to the tool.

Warning: If you would like to generate data contracts from schemas make sure to use the /dataContractOnly option.

それは私を完全に困惑させました。グーグルでどんどん行き渡り、バスの運転手としてのキャリアを考え直しても、ついに開発ボックスでうまくいく理由を考えました。IIS構成の問題か?

開発ボックスとライブボックスの両方を同時にリモートで操作し、それぞれでIISマネージャー(IIS 7.5を実行)を起動しました。次に、各サーバーの値を比較して、各ボックスの各構成設定を確認しました。

また、問題があります。サイトの[SSL設定]で、[SSLが必要]がオンになっていることを確認し、[クライアント証明書]ラジオボタンで[承諾]をオンにしてください。問題が修正されました!


5

これは、参照を追加して削除し、同じ名前のサービスを再度追加するたびによく発生することがわかりました。型の競合は、Visual Studioがまだ確認できる場所に残っている古いファイルが原因で発生するようです。それを修正するために私がする必要があるのは、新しい参照を追加する前のクリーンです。

  1. 問題のあるサービス参照を削除します。
  2. ソリューションエクスプローラーでプロジェクト名をクリックして、プロジェクトを強調表示します。
  3. プロジェクト参照を右クリックします。
  4. コンテキストリストの上部にある[ クリーン ] アイテムをクリックします。
  5. 通常どおりにサービス参照を追加します。

お役に立てれば。


3

以前のバージョンからアップグレードしたSilverlight 5でこの問題が発生しました。

サービス参照を再度追加しても、空のReference.csが返されました

結局、まったく新しいプロジェクトを作成し、サービス参照を再作成する必要がありました。これに30分以上費やした場合は、これを試してみてください。元のプロジェクトを修正することに決めたとしても、何が起こっているかを確認するためだけにこれを試して、問題を修正するために逆方向に作業することもできます。

私は問題が何であるかを正確に理解したことはありません-.csprojファイルの何かがアップグレードされなかったか、またはいくつかの設定が間違っていました。


1
古いバージョンを参照していたことがSystem.Xml.Linq
わかり

1

これが発生し始めたときに最近コレクションをプロジェクトに追加した場合、同じCollectionDataContract属性を持つ2つのコレクションが問題の原因である可能性があります。

[CollectionDataContract(Name="AItems", ItemName="A")]
public class CollectionA : List<A> { }

[CollectionDataContract(Name="AItems", ItemName="A")]  // Wrong
public class CollectionB : List<B> { }

プロジェクトを一掃し、すべてのNameおよびItemName属性が一意であることを確認して、エラーを修正しました。

[CollectionDataContract(Name="AItems", ItemName="A")]
public class CollectionA : List<A> { }

[CollectionDataContract(Name="BItems", ItemName="B")]  // Corrected
public class CollectionB : List<B> { }

次に、サービス参照を更新すると、すべてが再び機能しました。



1

私の場合、うまくいかなかったこれらの答えを読んだ後、私のために働いたテクニックは、私の契約のすべてをコメントアウトし、それが機能しなくなるまで、バイナリ検索の方法でコメントを外すことでした。これにより、コードの問題のビットが絞り込まれます。

次に、そのコードのどこが間違っているかを推測する必要があります。

もちろん、ツールのいくつかのエラーフィードバックが役に立ちました。

Webサービス契約を書いています。メンバーのいないプレースホルダー列挙がありました。それで大丈夫です。しかし、別のクラスのプロパティで使用し、クライアントでコントラクトdllを再利用すると、codegenはエラーメッセージなしで爆発します。svcutil.exeを実行しても問題は解決せず、理由を説明せずにcsファイルを出力できませんでした。


すべての運用契約をコメントアウトするのがうまくいきました。私は犯人として間違った方法を見ていました。トラブルシューティングの基本的なアプローチに戻っていただきありがとうございます。
fizch 2015年

1

以下はここにはリストされていませんが、私が採用した解決策でした(SvcUtilsはエラーメッセージを表示するのに役立ちました。しかし、私が得たエラーはでしたwrapper type message cannot be projected as a data contract type since it has multiple namespaces。つまり、このリードをたどり、これwsdl.exeを介し学習しました投稿)。

私の場合、wsdl [ my-asmx-service-address ]を実行するだけで問題のない.csファイルが生成されました。このファイルをプロジェクトに含め、サービスを使用するようにインスタンス化しました。


0

@dbloodが指摘するように、主な問題はDataContractSerializerにあり、型を正しく再利用しません。ここにはすでにいくつかの答えがありますので、これらについていくつかの長所と短所を追加することから始めます:

  • 'IsReference'フラグは多くの問題を引き起こしますが、それを削除することが必ずしも解決策とは限りません(特に、再帰が発生する状況では)。
  • 根本的な問題は、データコントラクトがタイプ名と同じではないことがありますが、それが時々同じであるということです(ええと、そうです、あなたはそれを正しく読みました)。どうやらシリアライザはかなりうるさいので、実際の問題を見つけるのは非常に困難です。
  • 「サービス参照の構成」から「参照チェック」を削除しても機能しますが、複数の実装が残っています。ただし、DLL間でSOAPインターフェイスを再利用することがよくあります。また、私が知っている最も成熟したSOAでは、複数のサービスインターフェイスが同じインターフェイスクラスを実装および拡張しています。「参照型の使用」チェックを削除すると、オブジェクトを単純に渡すことができなくなります。

幸い、サービスを管理している場合は、これらすべての問題を解決する簡単なソリューションがあります。これは、DLL間でサービスインターフェイスを再利用できることを意味します。これは、IMOが適切なソリューションのためになくてはならないものです。これはソリューションが機能する方法です:

  1. 別のインターフェイスDLLを作成します。そのDLLに、すべてのDataContractとServiceContractを含めます。ServiceContractをインターフェイスに配置します。
  2. インターフェースからサーバー実装を派生させます。
  3. 同じDLLを使用して、好みの方法でクライアントを構築します。例(IMyInterfaceはサービスコントラクトインターフェイスです):

    var httpBinding = new BasicHttpBinding();
    var identity = new DnsEndpointIdentity("");
    var address = new EndpointAddress(url, identity, new AddressHeaderCollection());
    var channel = new ChannelFactory<IMyInterface>(httpBinding, address);
    return channel.CreateChannel();

言い換えると、「サービス参照の追加」機能を使用しないでください。ただし、プロキシ生成をバイパスして、WCFに(正しい)サービスタイプを強制的に使用させます。結局、あなたはすでにこれらのクラスを持っています。

プロの:

  1. svcutil.exeプロセスをバイパスします。つまり、IsReferenceの問題はありません。
  2. DataContractのタイプと名前は、定義により正しいです。結局のところ、サーバーとクライアントの両方がまったく同じ定義を使用しています。
  3. APIを拡張したり、別のDLLのタイプを使用したりしても、(1)と(2)は引き続き保持されるため、そこで問題が発生することはありません。

短所:

  1. a-syncプロキシを生成しないため、A-syncメソッドは面倒です。そのため、Silverlightアプリケーションでこれを行うことはお勧めしません。

0

また、両方のプロジェクト参照(サービスプロジェクトとサービスへの参照を持つプロジェクト)を操作すると、サービス参照が壊れるという問題もありました。たとえば、参照プロジェクトの.dllが「Contoso.Development.Common」と呼ばれているが、プロジェクト名が単に「Common」に短縮されている場合、このプロジェクトへのプロジェクト参照も単に「Common」という名前になります。ただし、サービスは、クラスを解決するために "Contoso.Development.Common"への参照が必要です(このオプションがサービス参照オプションでアクティブになっている場合)。

エクスプローラーで、サービスと「共通」プロジェクトを参照しているプロジェクトのフォルダーを開きました。そこで、VSプロジェクトファイル(.csproj)をメモ帳で編集しました。参照されているプロジェクトの名前(この例では "Common.csproj")を検索すると、プロジェクト参照を表す構成エントリがすぐに見つかります。

私が変更され

<ProjectReference Include="..\Common\Common.csproj"> <Project>{C90AAD45-6857-4F83-BD1D-4772ED50D44C}</Project> <Name>Common</Name> </ProjectReference>

<ProjectReference Include="..\Common\Common.csproj"> <Project>{C90AAD45-6857-4F83-BD1D-4772ED50D44C}</Project> <Name>Contoso.Development.Common</Name> </ProjectReference>

重要なことは、参照の名前を、参照されるプロジェクトが出力として持っているdllの名前に変更することです。

次に、VSに切り替えます。VSの外部で変更されているため、プロジェクトをリロードするよう求められます。再読み込みボタンをクリックします。

そうした後、サービス参照の追加と更新は期待どおりに機能しました。

これが他の人にも役立つことを願っています。

MHよろしく


0

昨日、開発中に同様の問題に直面しました。2つの異なるバージョンのコントラクトで同じ名前空間を使用していることがわかりました。

たとえば、バージョン4とバージョン5の2つのバージョンの契約があります。バージョン4からすべてのコントラクトをコピーし、すべての名前空間をバージョン4からバージョン5に名前変更しました。これを行っているときに、ファイルの1つで名前空間の名前をv4からv5に変更するのを忘れました。名前空間の競合のため、Reference.csファイルは空でした。

サービス参照の生成中にエラーメッセージが表示されないため、この問題のトラブルシューティングは困難です。この問題を特定するには、作成したすべての新しいファイルを手動で検証します。この問題を解決する方法は他にもあります。これは、他のオプションに進む前に実行する必要がある最初のステップです。


0

上記のJohn Saundersの投稿のおかげで、エラーウィンドウを確認することができました。一日中頭を抱えていて、出力ウィンドウでエラーがないか調べていました。

私の場合、犯人はISerializableでした。Exception型のDataMemberプロパティを持つDataContractクラスがあります。ISerializableキーワードを持つタイプのDataMemberを持つことはできません。この例外では、ISerializableを削除するとすぐに、すべてが魅力的に機能しました。


0

でこの問題をトラブルシューティングしようsvcutilとすると、dbloodの回答で言及されているエラーが表示されました(「参照されたタイプは、インポートされたDataContractと一致しないため、使用できません」)。

私の場合、根本的な原因はDataContract属性を持つ列挙型であるように見えましたが、そのメンバーにはEnumMember属性が設定されていませんでした。svcutil指摘された問題のクラスには、その列挙型のプロパティがありました。

これはdbl​​oodの回答へのコメントとしてはぴ​​ったりですが、そのための十分な担当者ではありません...


0

私の場合、C#UserControlを参照するVB Webフォームプロジェクトのソリューションがありました。VBプロジェクトとCSプロジェクトの両方に同じサービスへのサービス参照がありました。参照は、VBプロジェクトのサービス参照の下、およびCS(フレームワーク)プロジェクトの接続されたサービスグル​​ープの下に表示されました。

VB Webフォームプロジェクトでサービス参照を更新する(つまり、Reference.vbファイルが空にならない)ために、CSプロジェクトを削除してから、VBサービス参照を更新してから、CSプロジェクトを再び追加する必要がありました。ソリューション。


0

次の手順を実行します:

  1. サービス参照を削除
  2. Visual Studioを閉じる
  3. / Binおよび/ Objフォルダーを削除します。
  4. Visual Studioを開きます。
  5. サービス参照を追加します。
  6. どういたしまして :)

サービスの追加時にこれらのフォルダーにいくつかの参照が残っているようで、コードの自動生成中にエラーが発生します。

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