Отправка объектов с пользовательскими атрибутами через сервис wcf - PullRequest
7 голосов
/ 14 мая 2010

Я только начал изучать WCF, потому что он мне нужен для школьных заданий. Но у меня проблема, когда я пытаюсь отправить объект с некоторыми пользовательскими атрибутами. Объект:

[DataContract]
public class Person
{
    [DataMember]
    [Searchable("ID")]
    public virtual String ID
    {
        get;
        set;
    }

    [DataMember]
    [Searchable("LastName")]
    public virtual String LastName
    {
        get;
        set;
    }

    [DataMember]
    [Searchable("FirstName")]
    public virtual String FirstName
    {
        get;
        set;
    }
}

Настраиваемый атрибут:

[DataContract]
[AttributeUsage(AttributeTargets.Property)]
public class Searchable:Attribute
{
    public Searchable(String PropertyName)
    {
        this.PropertyName = PropertyName;
    }

    [DataMember]
    public virtual String PropertyName
    {
        get;
        set;
    }
}

Я использую svcutil для генерации файла конфигурации и клиента. Связь между клиентом и сервисом идет нормально. Но когда я получаю объект типа Person и пытаюсь найти атрибут типа Searchable , я не могу найти ни одного.

Возможно ли это? Если да, не могли бы вы дать какие-либо советы о том, как добиться такого поведения?

Спасибо. Денис.

Ответы [ 2 ]

15 голосов
/ 14 мая 2010

WCF - это служба, основанная на сообщениях - вы сериализуете свое сообщение с одной стороны, пересылаете его и получаете с другой стороны. Вы не отправляете объекты , как вы выразились - вы отправляете только сериализованные сообщения. Это довольно важное отличие!

Ваш сервер и клиент полностью отделены друг от друга - они не разделяют ничего, кроме описания сервиса (списка методов сервиса) и контрактов данных в форме XML-схемы.

То, что вы получаете при создании клиента, - это прокси для методов службы и копия контракта данных (выглядит одинаково, но обычно в другом пространстве имен), который имеет тот же подпись в сериализованном формате. Это все, что есть. Вы получаете новый отдельный класс на стороне клиента, который будет сериализован в тот же формат, что и ваш исходный класс на стороне сервера.

Это означает, что вы получите те же поля и свойства - но это все. Все остальное (например, реализованные интерфейсы, атрибуты .NET и т. Д.) не реплицируется. Они не могут быть - в конце концов, WCF совместим - клиент может быть приложением PHP или программой Ruby. Как они будут обрабатывать пользовательские атрибуты .NET?

Итак, вкратце: все, что является специфическим для .NET и выходит за рамки простого представления данных на основе XML-схемы, не может использоваться в службе WCF.

Существует дыра в петле - если вы контролируете оба конца связи - и сервер, и клиент - и оба .NET, то вы могли бы:

  • поместите все ваши контракты на обслуживание и данные в отдельную общую сборку
  • ссылка на эту сборку в реализации вашего сервиса на стороне сервера
  • ссылка на эту сборку в прокси на стороне клиента

Используя это, вы получите одну сборку с одинаковым типом данных как на стороне сервера, так и на стороне клиента - и с этой «лазейкой» вы можете сохранить такую. Специфика NET как атрибуты между сервером и клиентом.

0 голосов
/ 29 апреля 2016

Я затронул эту же проблему сегодня (6 лет спустя, я знаю). В любом случае, я столкнулся с проблемой, когда я отправлял свойство ExtensionData в хранимый процесс на стороне сервера, который я не хотел отправлять. Так что моя проблема была действительно полностью на стороне сервера. Все, что мне необходимо сделать, - это объявить атрибуты в моей службе wcf, и, когда я создаю свои параметры, просто получаю те, которые имеют правильный атрибут, чтобы я не отправлял это свойство вместе с другими моими свойствами / параметрами.

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