У меня есть WCF DataContract
, который выглядит следующим образом:
namespace MyCompanyName.Services.Wcf
{
[DataContract(Namespace = "http://mycompanyname/services/wcf")]
[Serializable]
public class DataContractBase
{
[DataMember]
public DateTime EditDate { get; set; }
// code omitted for brevity...
}
}
Когда я добавляю ссылку на эту службу в Visual Studio, этот прокси-код генерируется:
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3082")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://mycompanyname/services/wcf")]
public partial class DataContractBase : object, System.ComponentModel.INotifyPropertyChanged {
private System.DateTime editDateField;
private bool editDateFieldSpecified;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order=0)]
public System.DateTime EditDate {
get {
return this.editDateField;
}
set {
this.editDateField = value;
this.RaisePropertyChanged("EditDate");
}
}
/// <remarks/>
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool EditDateSpecified {
get {
return this.editDateFieldSpecified;
}
set {
this.editDateFieldSpecified = value;
this.RaisePropertyChanged("EditDateSpecified");
}
}
// code omitted for brevity...
}
Как вы можете видеть, помимо создания свойства backing для EditDate
, генерируется дополнительное свойство <propertyname>Specified
. Все хорошо, за исключением того, что когда я делаю следующее:
DataContractBase myDataContract = new DataContractBase();
myDataContract.EditDate = DateTime.Now;
new MyServiceClient.Update(new UpdateRequest(myDataContract));
EditDate
не получал доступ к конечной точке службы (не отображается в переданном XML).
Я отлаживал код и обнаружил, что, хотя я устанавливал EditDate
, свойство EditDateSpecified
не было установлено на true
, как я ожидал; следовательно, XML-сериализатор игнорировал значение EditDate
, даже если оно установлено на допустимое значение.
В качестве быстрого взлома я изменил свойство EditDate
, чтобы выглядеть следующим образом:
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order=0)]
public System.DateTime EditDate {
get {
return this.editDateField;
}
set {
this.editDateField = value;
// hackhackhack
if (value != default(System.DateTime))
{
this.EditDateSpecified = true;
}
// end hackhackhack
this.RaisePropertyChanged("EditDate");
}
}
Теперь код работает так, как ожидалось, но, разумеется, каждый раз, когда я снова создаю прокси-сервер, мои изменения теряются. Я могу изменить код вызова на следующее:
DataContractBase myDataContract = new DataContractBase();
myDataContract.EditDate = DateTime.Now;
myDataContract.EditDateSpecified = true;
new MyServiceClient.Update(new UpdateRequest(myDataContract));
но это также похоже на хакерскую трату времени.
Итак, наконец, мой вопрос: есть ли у кого-нибудь предложение о том, как преодолеть это неинтуитивное (и IMO-нарушение) поведение генератора прокси-сервера службы Visual Studio, или я просто что-то пропустил?