Служба WCF и интерфейс - результат является объектом, хотя ServiceKnownType был использован - PullRequest
0 голосов
/ 12 мая 2010

Мне нужно преобразовать некоторые объекты, несовместимые с Silverlight, в модели для отправки через службу WCF. Я пытался использовать ServiceKnownType, но результат все еще объект. Я могу привести объект к модели после получения результата, но я не хочу делать это каждый раз. Вот пример того, что я пытался сделать.

Это хороший подход? Почему WCF не возвращает BikeModel как объект.

Интерфейс

public interface IBike
{
  string BikeName { get; set;}
}

Модель

[DataContract]
public class BikeModel : IBike
{
  [DataMember]
  public string BikeName { get; set; }
}

Другой объект, который нельзя использовать в Silverlight из-за MarshalObjectByRef и т. Д. В базовом классе

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 голосов
/ 12 мая 2010

Это просто опечатка, или это действительно так в вашей модели? Модельный класс должен быть украшен [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 не всегда совпадает с миром ....)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...