Gar*_*mel 7 .net service wcf serialization soap
我正在使用已在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
};
Run Code Online (Sandbox Code Playgroud)
这是通过电线发送的内容.我用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>
Run Code Online (Sandbox Code Playgroud)
其中两个参数,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");
}
}
Run Code Online (Sandbox Code Playgroud)
Gar*_*mel 24
问题得到解决.错误是SOAP服务已更新,现在某些属性是可选的.当字段/属性表示在SOAP消息中将XX标记为可选时,WCF会创建相应的额外XXIsSpecified属性,在设置XX值时必须将其设置为true.否则,WCF将不会序列化也不会发送该属性.
有不同的方法可以查看属性是否设置为可选.
在生成的Reference.cs文件中,每个可选项都有一个相应的IsSpecified属性,如下所示: private System.DateTime validFromField;
private bool validFromFieldSpecified;
您可以使用soapUI查看和测试wsdl
<xs:element minOccurs="0" name="validFrom" type="xs:dateTime"/>
归档时间: |
|
查看次数: |
4952 次 |
最近记录: |