Как сгенерировать весь класс datacontract - PullRequest
1 голос
/ 28 ноября 2011

У меня есть сервис чата с WCF. У меня есть класс, который помечен как атрибут datacontract

[DataContract]
public class Message
{
    string   _sender;
    string   _content;
    DateTime _time;

    [DataMember(IsRequired=true)]
    public string Sender
    {
        get { return _sender;  }
        set { 
            _sender = value;
        }
    }

    [DataMember(IsRequired = true)]
    public string Content
    {
        get { return _content;  }
        set { 
            _content = value;
        }
    }

    [DataMember(IsRequired = true)]
    public DateTime Time
    {
        get { return _time;  }
        set { 
            _time = value;
        }
    }
}

А мой сервисный контракт как ниже

[ServiceContract(Namespace="", SessionMode = SessionMode.Required, CallbackContract = typeof(IChatCallback))]
public interface IChat
{
    [OperationContract]
    bool Connect(Client client);

    [OperationContract(IsOneWay=true, IsInitiating=false, IsTerminating=true)]
    void Disconnect();

    [OperationContract(IsOneWay = true, IsInitiating = false)]
    void Whisper(string target, string message);
}

Когда я пытаюсь сгенерировать код клиента из VisualStudio 2010, класс Message не генерируется. Но он генерируется, когда я меняю тип параметра «message» в методе «Whisper» в контракте на обслуживание на «Message not string».

Я изменяю тип сообщения параметра на «Сообщение», а не «строка»:

[OperationContract(IsOneWay = true, IsInitiating = false)]
void Whisper(string target, Message message);

У меня есть класс обратного вызова, который требует, чтобы класс Message работал правильно.

public interface IChatCallback
{
    void RefreshClient(List<Client> clients);
    void ReceiveWhisper(Message message);
    void ReceiveNotifyClientConnect(Client joinedClient);
    void ReceiveNotifyClientDisconnect(Client leaver);
}

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

Ответы [ 2 ]

1 голос
/ 28 ноября 2011

Хорошо, я нашел решение.

Я забыл добавить атрибут operationcontract в мой класс обратного вызова.

public interface IChatCallback
{
    [OperationContract(IsOneWay = true)]
    void RefreshClient(List<Client> clients);

    [OperationContract(IsOneWay = true)]
    void ReceiveWhisper(Message message);

    [OperationContract(IsOneWay = true)]
    void ReceiveNotifyClientConnect(Client joinedClient);

    [OperationContract(IsOneWay = true)]
    void ReceiveNotifyClientDisconnect(Client leaver);
}
1 голос
/ 28 ноября 2011

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

Но он генерируется, когда я меняю тип параметра "message" в методе "Whisper" в контракте на обслуживание на Message, а не на строку.

Именно так и должно работать. Если сервису нужен этот класс, он будет сгенерирован. Если ему не нужен этот класс, он не будет сгенерирован.

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