Как сгенерировать весь класс 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, а не на строку.
Именно так и должно работать. Если сервису нужен этот класс, он будет сгенерирован. Если ему не нужен этот класс, он не будет сгенерирован.