回答:
一般に、それはコード生成の問題であることがわかり、ほとんどの場合、解決できないタイプ名の競合があるためです。
サービス参照を右クリックして[構成]をクリックし、[ 参照アセンブリでのタイプの再利用 ]をオフに すると、問題が解決する可能性があります。
この機能の一部を使用していた場合は、名前がクリーンアップされていることを確認する必要がある場合があります。
受け入れられた回答が指摘しているように、型を再利用するときの型参照の問題はおそらく原因です。問題を簡単に特定できない場合、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"
どこ:
ここでの完全なsvcutilコマンドラインリファレンス:http ://msdn.microsoft.com/en-us/library/aa347733.aspx
svcutilを実行すると、インポートによって例外がスローされていることがわかります。タイプの1つについて「このタイプのメッセージが表示される場合があります。「参照されたタイプは、インポートされたDataContractと一致しないため、使用できません。」
これは、サービスのDataContractで生成されたものと、参照されたアセンブリのタイプの1つが異なるという点で、単に指定されたとおりである可能性があります。私の場合、インポートしていたサービスには、共有アセンブリにあるものよりも新しい、更新された型がありました。例外で言及されているタイプは同じであるように見えたため、これはすぐにはわかりませんでした。違いは、型で使用されるネストされた複合型の1つでした。
このタイプの例外を引き起こし、結果として空白のreference.csを引き起こす可能性のある他のより複雑なシナリオがあります。一例を示します。
この問題が発生していて、データコントラクトでジェネリック型を使用していない場合、またはIsReference = trueを使用していない場合は、クライアントとサーバーで共有型がまったく同じであることを確認することをお勧めします。そうしないと、この問題が発生する可能性があります。
これが発生した場合は、[エラー]ウィンドウと[出力]ウィンドウを調べて、エラーメッセージがないかどうかを確認します。svcutil.exe
それでも問題が解決しない場合は、手動で実行してみて、エラーメッセージがないか確認してください。
私はこの正確な問題に丸一日頭を打ちました。修正しました。ここに方法があります...
サービスは 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が必要]がオンになっていることを確認し、[クライアント証明書]ラジオボタンで[承諾]をオンにしてください。問題が修正されました!
これは、参照を追加して削除し、同じ名前のサービスを再度追加するたびによく発生することがわかりました。型の競合は、Visual Studioがまだ確認できる場所に残っている古いファイルが原因で発生するようです。それを修正するために私がする必要があるのは、新しい参照を追加する前のクリーンです。
お役に立てれば。
以前のバージョンからアップグレードしたSilverlight 5でこの問題が発生しました。
サービス参照を再度追加しても、空のReference.csが返されました
結局、まったく新しいプロジェクトを作成し、サービス参照を再作成する必要がありました。これに30分以上費やした場合は、これを試してみてください。元のプロジェクトを修正することに決めたとしても、何が起こっているかを確認するためだけにこれを試して、問題を修正するために逆方向に作業することもできます。
私は問題が何であるかを正確に理解したことはありません-.csprojファイルの何かがアップグレードされなかったか、またはいくつかの設定が間違っていました。
System.Xml.Linq
これが発生し始めたときに最近コレクションをプロジェクトに追加した場合、同じ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> { }
次に、サービス参照を更新すると、すべてが再び機能しました。
私の問題は、「mex」を自分のWebサービスリンクの末尾に置いたままにすることでした。
「http://yeagertech.com/yeagerte/YeagerTechWcfService.YeagerTechWcfService.svc/mex」の代わりに
「http://yeagertech.com/yeagerte/YeagerTechWcfService.YeagerTechWcfService.svc」を使用してください
私の場合、うまくいかなかったこれらの答えを読んだ後、私のために働いたテクニックは、私の契約のすべてをコメントアウトし、それが機能しなくなるまで、バイナリ検索の方法でコメントを外すことでした。これにより、コードの問題のビットが絞り込まれます。
次に、そのコードのどこが間違っているかを推測する必要があります。
もちろん、ツールのいくつかのエラーフィードバックが役に立ちました。
Webサービス契約を書いています。メンバーのいないプレースホルダー列挙がありました。それで大丈夫です。しかし、別のクラスのプロパティで使用し、クライアントでコントラクトdllを再利用すると、codegenはエラーメッセージなしで爆発します。svcutil.exeを実行しても問題は解決せず、理由を説明せずにcsファイルを出力できませんでした。
以下はここにはリストされていませんが、私が採用した解決策でした(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
ファイルが生成されました。このファイルをプロジェクトに含め、サービスを使用するようにインスタンス化しました。
@dbloodが指摘するように、主な問題はDataContractSerializerにあり、型を正しく再利用しません。ここにはすでにいくつかの答えがありますので、これらについていくつかの長所と短所を追加することから始めます:
幸い、サービスを管理している場合は、これらすべての問題を解決する簡単なソリューションがあります。これは、DLL間でサービスインターフェイスを再利用できることを意味します。これは、IMOが適切なソリューションのためになくてはならないものです。これはソリューションが機能する方法です:
同じ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に(正しい)サービスタイプを強制的に使用させます。結局、あなたはすでにこれらのクラスを持っています。
プロの:
短所:
また、両方のプロジェクト参照(サービスプロジェクトとサービスへの参照を持つプロジェクト)を操作すると、サービス参照が壊れるという問題もありました。たとえば、参照プロジェクトの.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よろしく
昨日、開発中に同様の問題に直面しました。2つの異なるバージョンのコントラクトで同じ名前空間を使用していることがわかりました。
たとえば、バージョン4とバージョン5の2つのバージョンの契約があります。バージョン4からすべてのコントラクトをコピーし、すべての名前空間をバージョン4からバージョン5に名前変更しました。これを行っているときに、ファイルの1つで名前空間の名前をv4からv5に変更するのを忘れました。名前空間の競合のため、Reference.csファイルは空でした。
サービス参照の生成中にエラーメッセージが表示されないため、この問題のトラブルシューティングは困難です。この問題を特定するには、作成したすべての新しいファイルを手動で検証します。この問題を解決する方法は他にもあります。これは、他のオプションに進む前に実行する必要がある最初のステップです。
でこの問題をトラブルシューティングしようsvcutil
とすると、dbloodの回答で言及されているエラーが表示されました(「参照されたタイプは、インポートされたDataContractと一致しないため、使用できません」)。
私の場合、根本的な原因はDataContract属性を持つ列挙型であるように見えましたが、そのメンバーにはEnumMember属性が設定されていませんでした。svcutil
指摘された問題のクラスには、その列挙型のプロパティがありました。
これはdbloodの回答へのコメントとしてはぴったりですが、そのための十分な担当者ではありません...
私の場合、C#UserControlを参照するVB Webフォームプロジェクトのソリューションがありました。VBプロジェクトとCSプロジェクトの両方に同じサービスへのサービス参照がありました。参照は、VBプロジェクトのサービス参照の下、およびCS(フレームワーク)プロジェクトの接続されたサービスグループの下に表示されました。
VB Webフォームプロジェクトでサービス参照を更新する(つまり、Reference.vbファイルが空にならない)ために、CSプロジェクトを削除してから、VBサービス参照を更新してから、CSプロジェクトを再び追加する必要がありました。ソリューション。