Предоставление неиспользованного Enum из службы WCF - PullRequest
2 голосов
/ 23 февраля 2010

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

[DataContract]
public enum Columns
{
    [EnumMember]
    Column1= 0,
    [EnumMember]
    Column2= 1
}

[ServiceKnownType(typeof(Columns))]
public interface IService
{
    [OperationContract]
    Response GetObjects(Request request);
}

Пожалуйста, дайте мне знать, что я делаю не так?

Ответы [ 7 ]

3 голосов
/ 23 февраля 2010

Перечисление Columns должно быть свойством классов Request или Response, так как это единственные типы, включенные в WSDL. Типы, представленные в WSDL и, таким образом, видимые для клиента, являются только теми, которые используются в качестве входных или выходных параметров (и все, что является частью их иерархии классов) для методов контракта операции. Например, вы можете добавить перечисление в класс Request:

[DataContract]
public class Request
{
    [DataMember]
    public Columns Columns { get; set; }

    // ... some other properties
}
1 голос
/ 23 февраля 2010

Я не знаю, как заставить ваше перечисление появляться в вашем WSDL, когда оно не используется самой службой.

Но если вы поддерживаете и клиент, и сервер, вы можете использовать общую библиотеку, которая содержит типы, используемые клиентом и сервером.

В наших проектах мы вообще не используем WSDL, мы используем ChannelFactory , чтобы создавать клиентские прокси и ссылаться на интерфейс из общей библиотеки DLL.

1 голос
/ 23 февраля 2010

Метаданные службы предназначены для описания типов, необходимых для взаимодействия со службой - сообщений о запросах и ответах. Не следует пытаться включать случайные типы в метаданные службы.

Если вы хотите предоставить своим клиентам какой-то случайный тип, тогда клиенты должны ссылаться на библиотеку типов, которая содержит типы.

1 голос
/ 23 февраля 2010

Атрибут ServiceKnownType предназначен для предоставления знаний о подклассах, на которые нет прямой ссылки. Например, если вы хотите, чтобы класс InheritedRequest (который наследуется от Request) можно было использовать в вашем методе «GetObjects».

0 голосов
/ 15 апреля 2012

Для аналогичного требования я создал фиктивную операцию DummyForProxyGeneration в контракте на обслуживание и добавил классы, которые я хотел сгенерировать в прокси, к запросу или ответу на операцию. Кстати, не рекомендуется выставлять enum в ответе wcf по причинам обратной совместимости.

См. https://stackoverflow.com/a/788281/52277

0 голосов
/ 15 августа 2011

Я опубликовал это в другом месте, но я собираюсь добавить это и здесь ... Думаю, я добавлю то, что я нашел в связи с этим. Читая об атрибуте KnownType, у десериализатора должна быть причина думать, что тип, на который вы ссылаетесь с KnownType, может быть передан. Если десериализатор знает все типы в ваших контрактах данных или в параметрах вашего метода, ему не нужен ваш вонючий "KnownTypes", чтобы выполнять свою работу, и поэтому он игнорирует их. Если у вас есть "объект", определенный как тип где-то в вашем сервисе ... о-о, бедный старый десериализатор не имеет ни малейшего представления, какой тип может проходить через него, поэтому он съедает все ваши известные типы и выплевывает их клиентский прокси.

Взломать? О да. Если вы в отчаянии, это работает? Да.

0 голосов
/ 23 февраля 2010

Удалите [DataContract] сверху enum .

вы используете [DataContract] и [DataMember] только для перечисления , если хотите, чтобы некоторые элементов в перечислении перечисления были доступны для клиентов сервис, но не все. если вы хотите, чтобы все члены перечисления enum оставляли без тегов.

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