次のように、個別のアセンブリで定義されたインターフェイスとクラスがあります。
namespace DataInterfaces
{
public interface IPerson
{
string Name { get; set; }
}
}
namespace DataObjects
{
[DataContract]
[KnownType( typeof( IPerson ) ) ]
public class Person : IPerson
{
[DataMember]
public string Name { get; set; }
}
}
これは私のサービスインターフェースです:
public interface ICalculator
{
[OperationContract]
IPerson GetPerson ( );
}
クライアントのサービス リファレンスを更新すると、Reference.cs で次のようになります。
public object GetPerson() {
return base.Channel.GetPerson();
ここでは、KnownType が「オブジェクト」の代わりに IPerson を提供してくれることを期待していました。
私も[KnownType( typeof( Person ) ) ]
同じ結果で試しました。クライアントとサーバーの両方を制御できるので、両方の場所に DataObjects (Person が定義されている場所) と DataInterfaces (IPerson が定義されている場所) アセンブリがあります。私が見逃している明らかなものはありますか?KnownType は、WCF でインターフェイスを使用できるようにするための答えだと思いました。
----- 詳細情報 ----- Person クラスから KnownType を削除し、追加しました
[ServiceKnownType( typeof( Person ) ) ]
リチャードが提案したように、私のサービスインターフェースに。クライアント側のプロキシは同じように見えますが、
public object GetPerson() { return base.Channel.GetPerson();
、しかし今は爆発しません。ただし、クライアントには「オブジェクト」があるだけなので、それを有効にするには IPerson にキャストする必要があります。
var person = client.GetPerson ( );
Console.WriteLine ( ( ( IPerson ) person ).Name );