- 추가 서비스를 추가하기 위해 기존 서비스를 수정하고 있으며 서비스 나 클라이언트의 구조를 변경할 수 없습니다. ASMX가 구식이며 모범 사례가 사용되지 않는다는 것을 알고 있습니다.
매우 이상한 문제가 발생하며 올바르게 작동하는 방법을 알아낼 수 없습니다. 나는 ASMX 웹 서비스를 가지고있다. (나는 변칙적으로 알고있다. 나는 이것을 바꿀 수 없다.) 그것은 응답을 받고 압축으로 압축한다. 그런 다음 SOAP를 통해 클라이언트에 전달되고 클라이언트는 스트림을 가져 와서 압축을 풀고 "서비스 참조 추가"로 만든 계약과 XMLSerializer를 사용하여 객체를 비 직렬화합니다.부분적으로 실패한 ASMX 웹 서비스의 비 직렬화
내가 가지고있는 문제는 개체를 올바르게 deserialize 할 수 없다는 것입니다. 압축 전과 압축 해제 후의 XML은 똑같아 보이지만 웹 서비스가 매개 변수의 순서를 무시하고있는 것 같습니다. [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();
내 코드는 웹 서비스에
- 전화 걸리는 단계입니다
- 웹 서비스는 도우미를 호출하고 응답 객체를 반환
- 응답 개체가 압축되었습니다.
- 압축 된 객체가 비누 형식의 와이어를 통해 전송됩니다.
- 클라이언트가 응답을받습니다.
- 클라이언트는 "서비스 참조 추가"기능에서 제공하는 계약을 기반으로 비 직렬화합니다.
- 클라이언트는 응답의 기본 클래스에서 데이터를 deserialize하지만 응답 클래스 자체의 데이터는 deserialize되지 않습니다.