0

私はWCFクライアントサーバーをセットアップしています。サーバー側では、サービス メソッドの戻り値の型としてインターフェイスを使用してから、コントラクト/サービスに<ServiceKnownTypeAttribute>. これはすべて正常に機能しています。

ただし、非常に厄介な問題が 1 つあります。クライアントにサービス参照を追加すると、生成されたスタブ メソッドの戻り値の型はすべてobject. したがって、Intellisense はクライアントに存在しなくなりました。戻り値を完全に使用でき、プロパティにアクセスできますが、Intellisense を「復元」できるようにキャストを行う必要があります。

例:

サーバー方式:

<OperationContract()>
<ServiceKnownTypeAttribute(GetType(Something))>
Function GetSomething() As ISomething Implements Iservice.GetSomething

生成されたスタブ:

Function GetSomething() As Object Implements Iservice.GetSomething

クライアント コード (スタブの戻り値の型がオブジェクトであるため、ここでキャストする必要があります):

Dim s As ISomething= CType(client.GetSomething(), ISomething)

私は何かを見逃していますか、それともこれは単なる正常な動作ですか. オブジェクトをシリアル化でき、すべてが機能しているため、スタブがタイプ固有ではない理由がわかりません。

ありがとう

ジョナス

4

1 に答える 1

0

何が起こっているのか理解していると思いますので、説明を試みますが、その一部は経験に基づいた推測です.

まず、関数から実装する具象型を実際に生成していると推測しますがISomething、オブジェクトではなくインターフェイスを返しています。MySomething実装すると仮定するISomethingと、次のようになります。

Function GetSomething() As ISomething Implements Iservice.GetSomething

    ' code to create the object
    Return MySomething
End Function

これをコンソール アプリなどで呼び出す場合は、おそらく次のようにします。

Dim MySomething As ISomething = GetSomething()

ここで、私は経験に基づいた推測を行っています。

WCF は、サービス コントラクトのインターフェイスに基づいてプロキシを生成します。サービス コントラクトの操作コントラクトは具象クラスではなくインターフェイスを返すため、これを使用Objectして具象実装を生成し、データをネットワーク経由でシリアル化できるようにします。

この場合、クライアントはObjectが実装されていることを知らないため、 にキャストするISomething以外に Intellisense を「復元」する方法はありません。ObjectISomething

于 2013-09-13T04:28:19.690 に答える