- 請注意,我正在修改現有服務以添加額外的數據項,我無法更改服務或客戶端的結構。我知道ASMX已經過時,並沒有使用最佳實踐。
我遇到了一個非常奇怪的問題,我只是無法弄清楚如何讓這個工作正常。我有一個ASMX網絡服務(我知道它過時了,我不能改變這一點)這需要一個響應,並用zip壓縮來壓縮它。然後通過SOAP將其交付給客戶端,客戶端接收該流並對其進行解壓縮,並使用由「添加服務引用」和XMLSerializer創建的合約來反序列化對象。反序列化ASMX Web服務部分失敗
我遇到的問題是它無法正確反序列化對象。我的XML在壓縮之前和解壓縮後看起來完全一樣,但看起來Web服務忽略了我的參數排序。我嘗試過[DataMember],[MessageBodyMember],[XmlElement],[MessageHeader]都帶有正確的排序參數和MustUnderstand,但它似乎始終將元素粘貼在XML的底部。
這裏是什麼是混亂的,我messagecontract類從另一個消息協定類繼承,像這樣
[MessageContract(IsWrapped = true)]
public class MyClass : MyBaseContract{}
就好了,每次下觸頭反序列化的元素,即使我改變他們周圍,他們的工作只是罰款。那裏的元素根本不包含任何順序,他們只是工作。
這是我的反序列化代碼。
using (MemoryStream stream = new MemoryStream(data))
{
XDocument document = XDocument.Load(stream);
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(type);
System.Xml.XmlReader read = System.Xml.XmlReader.Create(new System.IO.StringReader(document.ToString()));
object o = serializer.Deserialize(read);
return o;
}
下面是序列化代碼:
XmlSerializer xs = new XmlSerializer(value.GetType());
MemoryStream stream = new MemoryStream();
xs.Serialize(stream, value);
stream.Position = 0;
StreamReader sr = new StreamReader(stream);
return sr.ReadToEnd();
因此,這裏是我的代碼需要
- 電話到網絡服務的步驟
- Web服務調用助手,並返回一個響應對象
- 響應對象被壓縮
- 壓縮對象以肥皂格式通過電線發送
- 客戶端獲得響應
- 客戶端根據「添加服務引用」功能提供的合約進行反序列化。
- 客戶端管理反序列化來自響應基類的數據,但響應類本身沒有任何反序列化。