WCF服务和接口 - 结果是对象,即使使用了ServiceKnownType

时间:2010-05-11 20:17:26

标签: silverlight wcf

我需要将一些与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();

    };
}

1 个答案:

答案 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>