2009-10-13 3 views
1

wsdl.exe를 사용하여 거대한 wsdl 파일에서 웹 서비스 프록시 코드를 자동 생성합니다. 그런 다음 생성하는 .cs 파일을 가져 와서 DLL로 컴파일하고 내 프로그램에서 웹 서비스 호출을 사용합니다.직렬화 가능 wsdl.exe를 사용하여 웹 서비스 프록시 코드를 생성하는 방법

문제는 내 프로그램에서 sql 세션 상태를 사용할 때 세션 상태에 proxxy 개체를 저장할 수 없다는 것입니다. wsdl.exe에서 주 클래스를 serialize 된 파일로 생성했지만 serializable이 아닌 System.Web.Services.Protocols.SoapHttpClientProtocol을 상속했기 때문에 문제가되지 않습니까?

자동 생성 코드가 세션 상태에서 작동하도록하는 방법을 아는 사람이 있습니까?

+0

왜 응용 프로그램 프록시 인스턴스 자체를 직렬화 할 필요합니까? 이것은 웹 서비스 프록시이기 때문에; 그것은 단순히 데이터를 트랜잭션으로 반환하고 일부 데이터 구조를 채우는 메소드를 갖고 있지 않습니까? 데이터 구조가 실제로 직렬화하려는 것입니까? – gn22

+0

@Aros, 나는 Gurdas와 같은 질문을 가지고있다. 프록시 객체 자체 나 그것이 운반하는 데이터를 직렬화하려고합니까? –

답변

1

일반적으로 상태 인 (엔티티)을 직렬화하며 WSDL 서비스 래퍼는 직렬화하지 않습니다. WSDL에 생성 된 유형의 다른 절반

namespace MyNamespace 
{ 
    [Serializable] partial class Customer {} 
    [Serializable] partial class Order {} 
    [Serializable] partial class Address {} 
} 

이것은 결합 : 당신이 속성 같은 것들을 추가하는 두 번째 코드 파일을 추가 할 수 있음을 의미 대부분의 코드 세대 2.0 partial 클래스로 파일을 기록하기 때문에, 그리고 BinaryFormatter에서 사용할 수 있도록해야합니다. 그러나 개인으로 나는 그것이 나쁜 방법이라고 생각합니다. wsdl.exe를 사용하고 있기 때문에 유형은 이미 XmlSerializer을 통해 직렬화 가능합니다. BinaryFormatter (기본적으로 사용되며 매우 취약한 것)으로 serialize하는 대신 XmlSerializer을 통해 string 또는 byte[]으로 serialize하고 을 세션 상태에 추가하는 것이 좋습니다. 이것은 여분의 코드 변경없이 작동 할 것이고, BinaryFormatter의 여러 취성 포인트를 피할 수 있기 때문에 더 강력합니다. 예를 들어

:

static string SerializeXml<T>(T obj) where T : class 
{ 
    if (obj == null) return null; 
    StringWriter sw = new StringWriter(); 
    using (XmlWriter xw = XmlWriter.Create(sw)) 
    { 
     new XmlSerializer(typeof(T)) 
      .Serialize(xw, obj); 
    } 
    return sw.ToString(); 
} 
static T DeserializeXml<T>(string xml) where T : class 
{ 
    if (xml == null) return null; 
    using (XmlReader xr = XmlReader.Create(new StringReader(xml))) 
    { 
     return (T)new XmlSerializer(typeof(T)) 
      .Deserialize(xr); 
    } 
} 
+0

매우 자세한 게시물과 샘플 코드를 보내 주셔서 감사합니다. :) –

관련 문제