Как сгенерировать весь класс datacontract

У меня есть служба чата с 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, а не на строку.

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

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

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

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

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

2 ответа

Решение

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

Я забыл добавить атрибут 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);
}

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

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

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

Другие вопросы по тегам