私のwcfクライアントに次のエラーがあります。wcfのknowntype属性の問題
NetDispatcherFaultExceptionが処理されませんでした。
メッセージをデシリアライズしようとしているときにフォーマッタが例外をスローしました。パラメータhttp://tempuri.org/:GetVehicleResultを逆シリアル化しようとしてエラーが発生しました。 InnerExceptionメッセージは、ライン1の位置266でエラーです。エレメント 'http://tempuri.org/:GetVehicleResult'には、名前「http://schemas.datacontract.org/2004/07/WCFServer:Car」にマップされているタイプのデータが含まれています。デシリアライザには、この名前にマップされている型の知識はありません。 DataContractResolverを使用するか、「Car」に対応する型を既知の型のリストに追加することを検討してください。たとえば、KnownTypeAttribute属性を使用するか、DataContractSerializerに渡される既知の型のリストに追加します。詳細については、InnerExceptionを参照してください。
誰がどこで障害を助けることができますか?
WCFサーバー
IVehicle
--------
[ServiceContract]
public interface IVehicleService
{
[OperationContract]
Vehicle GetVehicle(int type);
[OperationContract]
int GetNumberOfWheels(Vehicle vehicle);
}
VehicleService
[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]
public class VehicleService : IVehicleService
{
public Vehicle GetVehicle(int type)
{
switch (type)
{
case 0:
return new Car()
{
ID = 10,
Brand = "Volvo",
SteeringWheelPosition = "left"
};
case 1:
return new bike()
{
ID = 11,
Brand = "Scott",
HasFrontWheelBreak = true
};
case 2:
return new Kidsbike()
{
ID = 12,
Brand = "Kid Scott",
HasFrontWheelBreak = false,
HasSupportingWheels = true
};
default:
return null;
}
}
public int GetNumberOfWheels(Vehicle vehicle)
{
return vehicle.NoOfWheels;
}
}
抽象クラス
[KnownType(typeof(Car))]
[KnownType(typeof(bike))]
[DataContract]
public abstract class Vehicle
{
[DataMember]
public int ID { get; set; }
abstract public int NoOfWheels { get; }
[DataMember]
public string Brand { get; set; }
}
ただ、クライアント側のプロキシを作成の
具象クラス
[DataContract]
public class Car : Vehicle
{
override public int NoOfWheels { get { return 4; } }
[DataMember]
public string SteeringWheelPosition { get; set; }
}
[KnownType(typeof(Kidsbike))]
[DataContract]
public class bike : Vehicle
{
override public int NoOfWheels { get { return 2; } }
[DataMember]
public bool HasFrontWheelBreak { get; set; }
}
[DataContract]
public class Kidsbike : bike
{
[DataMember]
public bool HasSupportingWheels { get; set; }
}
WCFクライアント
namespace WCFClient
{
[ServiceContract]
public interface IVehicleService
{
[OperationContract]
Vehicle GetVehicle(int type);
[OperationContract]
int GetNumberOfWheels(Vehicle vehicle);
}
}
namespace WCFClient
{
[KnownType(typeof(Car))]
[KnownType(typeof(bike))]
[DataContract]
public abstract class Vehicle
{
[DataMember]
public int ID { get; set; }
abstract public int NoOfWheels { get; }
[DataMember]
public string Brand { get; set; }
}
[DataContract]
public class Car : Vehicle
{
override public int NoOfWheels { get { return 0; } }
[DataMember]
public string SteeringWheelPosition { get; set; }
}
[KnownType(typeof(Kidsbike))]
[DataContract]
public class bike : Vehicle
{
override public int NoOfWheels { get { return 0; } }
[DataMember]
public bool HasFrontWheelBreak { get; set; }
}
[DataContract]
public class Kidsbike : bike
{
[DataMember]
public bool HasSupportingWheels { get; set; }
}
}
private void btnGetVehicle_Click(object sender, EventArgs e)
{
Car carObj = (Car)fclient.GetVehicle(0);
}
。私はサービスを正常に呼び出すことができますが、問題が発生しています。私はKnowntype属性で試してみます。これで何が間違っている。
@ rgpmaker-私はsvcutilの代わりに自己ホスト。しかし、私は同じエラーを取得しています。 –
私は抽象クラスの車、クライアントとサーバー側の両方で自転車を持っているが、実際の実装はサーバー側で、クライアント側はダミーです。 –