WCF выставляет общий тип 'T' - PullRequest
5 голосов
/ 19 января 2011

Я пишу сервис WCF для операции вставки и удаления, здесь мы использовали универсальный метод, но он выдает следующую ошибку "System.Runtime.Serialization.InvalidDataContractException: тип 'T' не может быть экспортирован как тип схемы, потому что это открытый универсальный тип. Вы можете экспортировать универсальный тип, только если все его универсальные типы параметров являются фактическими типами. "

здесь" EntityBase2 "является базовым классом для всех сущностей

[ServiceContract]
[ServiceKnownType(typeof(EntityBase2))]
public interface IBackupUtility
{
    [OperationContract]
    void Delete<T>(T entity) where T : EntityBase2;

    [OperationContract]
    void InsertORUpdate<T>(T entity) where T : EntityBase2;        
}

Вопрос в том, как я могу выставитьуниверсальный тип 'T'?

Ответы [ 3 ]

7 голосов
/ 11 июня 2012

Этот пост действительно старый, но, возможно, кто-то найдет это решение полезным: WCF и Generics

7 голосов
/ 19 января 2011

Я думаю, что это невозможно, как он может генерировать wsdl таким образом?

У вас есть два варианта:

  • Вы можете отправить тип в качестве параметра.

  • Если вы хотите раскрыть операции crud для сущностей, я бы порекомендовал использовать генератор кода, возможно, шаблон T4 для EF.

1 голос
/ 29 ноября 2014
  1. Ответом на этот вопрос является и Да, и Нет. Да для предполагаемого сервера и Нет для предполагаемого клиента.
  2. Мы можем создать общий Контракт данных на сервере, но, используя его в любом операционном контракте, мынеобходимо указать тип данных универсального.
  3. И на стороне клиента этот контракт данных будет представлен только как строго тип данных, а не универсальный.

    [DataContract]
    public class MyGenericObject<T>
    {
       private T _id;
    
       [DataMember]
       public T ID
       {
          get { return _id; }
          set { _id = value; }
       }
    }
    
    [OperationContract]
    MyGenericObject<int> GetGenericObject();
    

Это то, что мы имеем на сервере, которое мы можем видеть, используя общий контракт данных, мы должны указать тип, иначе это приведет к ошибке времени компиляции.

На клиенте то, что мы получаем из WSDL, этоследующее:

[DataContract]
public class MyGenericObjectOfint

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

Соглашениеиспользуется

универсальное имя класса + "Of" + тип имя параметра + хэш

хеш генерируется не всегда, он будет генерироваться только при наличии шансаименного столкновения.

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