18

ヒント:この質問には多くの重複がありますが、どの解決策も私にはうまくいきません。

私が持っているのはWebサービスとクライアントで、どちらも共有アセンブリ「DataModel」への参照を持っています。[サービス参照の追加...]ダイアログを使用してサービスプロキシを作成し、[参照されているすべてのアセンブリでタイプを再利用する]を選択していますが、それでも、私のものを再利用する代わりに新しいタイプを作成します。

  • 以前は機能していましたが、突然タイプを再利用しなくなりました
  • サービス参照を追加する前に共有アセンブリを参照しても機能しません
  • VS2010を再起動しても役に立ちません(すべての更新があります)
  • 単純なPOCOクラス(整数プロパティを含む単純なクラス)で試しましたが、運がありませんでした
  • サービス参照(または共有アセンブリ参照)の削除と再追加は役に立ちませんでした
  • 「指定された参照アセンブリでタイプを再利用する」で共有アセンブリを選択するだけです-運がありません
  • svcutil.exe /reference同じ結果が得られます

どういうわけか終わりです。他に解決策はありますか?

編集:プロジェクトを以前のコミットにリセットしただけで、どのコミットを使用しても同じ問題が発生することを追加する必要があります。そして、私はそれが以前のコミットで機能したことを知っています!

4

7 に答える 7

17

サービス参照を追加する前に共有アセンブリを参照しても機能しません

これを行うか、少なくとも参照を追加した後にサービス参照を更新する必要があります。

サービス参照(または共有アセンブリ参照)の削除と再追加は役に立ちませんでした

これを行う必要はありませんが、私も試してみました。

「再利用」が機能するためには、両方のプロジェクト(クライアントとサービス)が同じバージョンのアセンブリを使用している必要があります。プロジェクトを参照していますが、これは良いことです。バージョンが異なるため、アセンブリを直接参照するときにこれに遭遇しました。

他に試すべきことがいくつかあります

  • ソリューションの「ConfigurationManager」を開きます-共有アセンブリがビルドするように構成されていることを確認します。
  • クライアントとサービスの両方にプロジェクト参照を使用していることを確認してください。サービスが古いバージョンを使用している場合、クライアントで最新のアセンブリを使用しても役に立ちません。
  • プロジェクト参照とビルドを削除し、ビルドが失敗することを期待します-失敗しない場合は、他の何かを参照している必要があります。
  • 最新の「共有アセンブリ」がサービスとクライアントの両方binのビルドに含まれていることを手動で確認します。フォルダーを確認し、アセンブリのバージョン/ビルドの日付を確認します。

他のすべてが失敗した場合、両側で同じオブジェクトを強制する最良の方法は、「サービス参照」プロキシを完全に削除し、ChannelFactoryメソッドを使用することです。サービス参照を追加せずにWCFサービスを呼び出す方法の簡単な説明と、直接ClientBase<>に対するサービス参照の追加のVS2010の利点を参照してください。これは、「サービス参照を更新...」する必要がなくなり、生成されたプロキシコードがすべて削除されるため、私の推奨するWCFパターンです。

于 2011-11-28T00:30:47.647 に答える
12

VS2013でサービス参照を追加したときに、共有dllのタイプが再利用されなかった理由を1日中調べました。サービスには、シリアル化に関連するいくつかの問題があったことが判明しました。EnumMember属性を持たない列挙がいくつかありました。問題を解決する方法は、次の手順を試すことでした。

  1. アトミックタイプを返さなかったServiceContractのすべての操作(OperationContract属性で装飾されたメソッド)をコメントアウトします。
  2. 次に、クライアントプロジェクトのサービス参照を更新します。クライアントプロジェクトで「[MyServiceReferenceName]」と入力すると、問題が解決したことに気付きました。そして、私のタイプは[MyServiceReferenceName]名前空間に表示されませんでした。念のため、生成されたXSDファイルをXMLスキーマブラウザーで開いてこれを確認しました。
  3. 手順1でコメント化されたメソッドのコメントを1つずつ解除します。次に、サービスリファレンスを毎回更新して、タイプが再送信されているかどうかを確認します
  4. サービスリファレンスがタイプの再利用に失敗する原因となっているメソッドを見つけたら、メソッドに入力または出力されるタイプの各クラスに移動します。シリアル化するすべてのクラスが[DataContract]属性で装飾されていることを確認してください。すべてのフィールドプロパティが[DataMember]属性で装飾されていることを確認してください。また、列挙型が[DataContract]で装飾されていること、および各列挙値が[EnumMember]で装飾されていることを確認してください

これがこの苛立たしいプロセスを経験している他の人に役立つことを願っています。この問題は必ずしも共有dllに関連しているわけではありません。私の問題は、サービス参照の追加または更新の使用に関する実際の問題ではありませんでした。問題は、エンティティ(モデル)クラスが、DataContractSerializerにそれらのタイプをシリアル化するように通知するための適切な属性で装飾されていないことにありました。シリアル化のいずれかの部分が失敗した場合、サービスリファレンスを追加するとすべてのタイプが追加されるようです。

于 2014-02-18T16:18:36.107 に答える
2

少し長めですが、1つの可能性として、古いバージョンの共有dllがGACに含まれている可能性があります。

共有dllの使用を試み、型が欠落しているdllを見つけてから、型の作成に戻ります。

于 2011-11-27T19:41:00.583 に答える
2

異議あり!

最近、私が働いている場所でも同じ問題が発生しました。問題を突き止めるのに4時間かかりましたが、最終的に、コピーを拒否しているオブジェクトと同じdll内のオブジェクトの列挙型が、サービスで使用されている別の列挙型と同じ名前であることがわかりました。そのdllからのタイプの再利用を拒否しました。

提案(解決策?):dll内に他のオブジェクトがないこと、またはそれらのオブジェクト上のオブジェクト、または...などがサービス内のものと同じ名前であることを確認してください。

于 2012-08-22T19:40:05.217 に答える
0

これは古いトピックですが、今日同じ問題が発生したので、修正を共有したいと思います。

私にとっての問題は、共有アセンブリが両方のプロジェクト(サービスとクライアント)で正しく追加されたということでしたが、サービス側では、この共有アセンブリがクライアント側に存在しない別のアセンブリを参照していました。

以下のステートメントでSvcutil.exeを使用してエラーに気づきました。SvcUtil.exeが配置されているフォルダー(私にとってはC:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6.1 Tools)でコマンドラインを開き、以下を変更した後、以下のステートメントを実行します。セグメント(<>でマーク):

SvcUtil.exe /t:code /language:cs  /r:<path of the .dll that contains the types to reuse on client side> <wcf service url>

再利用するタイプの.dllが物理的に/binフォルダーに存在することを確認してください(ビルドエラーのために存在しない可能性があります...)。必要に応じて、サービスから正しいビルドをコピーします。

SvcUtilは、指定されたサービスからのWSDLドキュメントに基づいてサービスおよび/またはデータコントラクトを生成しようとします。/ rタグは、再利用可能なタイプを含むクライアント側の.dllの場所を指定します(「サービス参照の追加」を使用する場合と同じように)。

タイプの再利用に問題がある場合は、ステートメントの実行時にコマンドラインに表示されます。

これにより、共有アセンブリに問題がある正しい方向を示すことができます。

于 2018-08-21T14:06:55.610 に答える
0

ここですべての答えを確認した後、何も機能しませんでした。次に、ブラウザーでwsdlを表示すると、サービスでエラーが発生したことに気付きました。これは明らかなはずですよね?さて、何が起こったのか見てみましょう。サービスのソリューションファイルを別の(管理者なしの)ユーザーとして開き、再利用可能なタイプの1つの名前を更新しました。私のソリューションを構築し、すべてが正常に構築されました。それは私がOPによって記述された問題に遭遇したときです。

管理者以外のアカウントでログインし、IIS Expressを使用していなかったため、何が起こったのでしょうか。WCFプロジェクトが読み込まれませんでした。タイプの名前変更がWCFプロジェクトで有効にならなかったことを意味します。したがって、問題が発生します。

TLDR; 消費するアプリケーションで問題を探す前に、サービスが実際に開始され、正しく機能することを確認してください。

于 2018-10-04T10:31:55.293 に答える
0

回答のリストに別の状況を追加すると思いました。たとえば、タイプを再利用する場合など、共通のコレクションから継承するタイプがある場合は、参照されるすべてのアセンブリでタイプDictionary<K, V>を再利用することを選択する必要があります。指定された参照アセンブリでタイプを再利用することを選択した場合は、データコントラクトを含むアセンブリに加えて、必ずアセンブリ(汎用コレクションのホーム)を選択してください。System

私たちの状況では、クラスの定義は次のようになりました。

public class FooMetadata : Dictionary<Guid, FooMetadataType>
{
}

どこFooMetadataTypeにありましたか[DataContract]。また、すでに;としてマークされている[DataContract]ため、このクラスを装飾することはできません。サービスはコンパイルされますが、デプロイ時に.svcファイルを参照するとYSODが取得されます。Dictionary[Serializable]

于 2020-08-14T17:16:32.433 に答える