我需要将一些与Silverlight不兼容的对象转换为通过WCF服务发送的模型。我尝试过使用ServiceKnownType,但结果仍然是对象。在我检索结果后,我能够将对象转换为模型,但我不想每次都这样做。这是我尝试过的一个例子。
这是一个好方法吗?为什么WCF不将BikeModel作为对象返回。
接口
public interface IBike
{
string BikeName { get; set;}
}
模型
[DataContract]
public class BikeModel : IBike
{
[DataMember]
public string BikeName { get; set; }
}
由于基类中的MarshalObjectByRef等而无法在Silverlight中使用的其他对象
public class Bike : IBike, UnusableBaseClass
{
....
}
IService1
[ServiceContract]
[ServiceKnownType(typeof(BikeModel))]
public interface IService1
{
[OperationContract]
IBike GetBike();
}
服务
public class Service1 : IService1
{
public IBike GetBike()
{
Bike b = BikeManager.GetFirstBikeInTheDataBase();
return b;
}
}
MainPage.xaml.cs -
public MainPage()
{
InitializeComponent();
this.Loaded += (s, a) =>
{
ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();
client.GetBikeCompleted += (sender, e) =>
{
var d = e.Result;
// this cast works
BikeModel model = (BikeModel)d;
};
client.GetBikeAsync();
};
}
答案 0 :(得分:0)
这只是一个错字,还是在你的模型中真的像这样?模型类应使用 [DataContract]
- 而不是[DataMember]
进行修饰。它应该是这样的:
[DataContract]
public class BikeModel : IBike
{
[DataMember]
public string BikeName { get; set; }
}
击> <击> 撞击>
更新:好吧,这只是一个错字。
你能试试吗?将您的IBike
界面变为BaseBike
基类:
public class BaseBike
{
string BikeName { get; set;}
}
然后从您的通话中返回该基本类型
[ServiceContract]
[ServiceKnownType(typeof(BikeModel))]
public interface IService1
{
[OperationContract]
BaseBike GetBike();
}
这会改变什么吗?我知道WCF对于可以序列化的内容有点挑剔 - 因为所有序列化必须能够在XML模式中表示,所以你不能轻易使用接口和/或泛型。
您可以尝试的另一个选项是在操作中使用更具针对性的[KnownType]
属性,而不是[ServiceKnownType]
。再一次 - 不确定它是否会有所帮助,我在这里寻找想法....(从.NET的角度看你的东西看起来还不错 - 但是WCF通信并不总是完全相同的世界......) p>