【发布时间】:2012-01-08 20:35:50
【问题描述】:
我正在使用已在 VS2010 中作为服务引用导入的 SOAP 服务。我使用服务提供的请求对象调用其中一项服务。我遇到的问题是并非对象的所有属性都被序列化,或者不是通过网络发送。请求对象如下所示:
var serviceRequest = new UpdateRequest{
StoreId = request.StoreId,
Id = request.Id,
Status = (Status)Enum.Parse(typeof(Status), request.myStatus.ToString()),
parameters = request.Parameters,
validFrom = request.ValidFrom.Value,
validFromSpecified = request.ValidFromSpecified
};
这是通过网络发送的内容。我已经用wireshark捕获了它
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<updateStore xmlns="http://localhost.service.com/">
<StoreRequest>
<StoreId>1234</StoreId>
<validFrom>2011-11-29T00:00:00</validFrom>
<parameters>
<param1>true</param1>
</parameters>
</StoreRequest>
</updateStore>
</s:Body>
</s:Envelope>
Id 和 Status 这两个参数没有发送到服务,我就是不知道为什么。正在设置值,并且 WSDL 生成的属性是公共的,并且具有与正在序列化的属性相同的序列化属性。
任何帮助将不胜感激。
编辑---- 更新了服务参考生成代码
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.233")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://myservice.com/")]
public partial class StoreUpdateRequest : object,
System.ComponentModel.INotifyPropertyChanged {
private long StoreIdField;
private long IdField;
private bool IdFieldSpecified;
private Status StatusField;
private bool StatusFieldSpecified;
private long storeIdField;
private bool storeIdFieldSpecified;
private System.DateTime validFromField;
private bool validFromFieldSpecified;
private System.DateTime validToField;
private bool validToFieldSpecified;
private technicalParameters parametersField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order=0)]
public long StoreId {
get {
return this.StoreIdField;
}
set {
this.StoreIdField = value;
this.RaisePropertyChanged("StoreId");
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order=1)]
public long Id {
get {
return this.IdField;
}
set {
this.IdField = value;
this.RaisePropertyChanged("Id");
}
}
【问题讨论】:
-
也许是一个显而易见的问题,ID 和状态是什么类型?他们的类型是公开的吗?
-
你能发布你的 UpdateRequest 的定义吗?
-
Id 和 Status 也必须是属性(使用 get() 和 set()),而不仅仅是字段...
-
他们是
public吗?他们有get和set吗?他们标记为[Obsolete]吗?或[XmlIgnore]?有ShouldSerializeId()方法吗?还是IdSpecified属性?这里有很多未知数,看到类型会有所帮助。如果这是[DataContract],他们有[DataMember(...)]等 -
您的
UpdateRequest中是否还有其他属性(如ValidFromSpecified)也伴随着同名的bool属性+Specified?在这种情况下 - 您必须将(property)Specified值设置为 true - 否则,该属性将不会被序列化 - 无论它是否具有分配的值。
标签: .net wcf serialization soap service