2009-10-13 2 views
1

Я использую wsdl.exe для автоматического создания прокси-кода веб-службы из огромного файла wsdl. Затем я беру файл .cs, который генерирует его компиляцию в DLL и использует его в моей программе для совершения вызовов веб-службы.Как сгенерировать прокси-код веб-службы с wsdl.exe, который является сериализуемым

Проблема в том, что при использовании состояния сеанса sql в моей программе я не могу сохранить объект proxxy в состоянии сеанса. Я отметил основной класс в файле wsdl.exe, сгенерированном сериализуемым файлом, но это не имеет значения, поскольку он наследует System.Web.Services.Protocols.SoapHttpClientProtocol, который не является сериализуемым?

Кто-нибудь знает, как работает автогенерированный код с состоянием сеанса?

+0

Почему ваше приложение нужно сериализовать сам экземпляр прокси? Поскольку это прокси-сервер веб-службы; разве у него просто есть методы для возврата данных транзакционно и заполнения некоторой структуры данных? Является ли структура данных действительно тем, что вы хотите сериализовать? – gn22

+0

@ Арос, у меня есть тот же вопрос, что и у Гурды. Вы пытаетесь выполнить сериализацию самого прокси-объекта или данных, которые он несет? –

ответ

1

Как правило, вы должны сериализовать состояние (объекты), а не WSDL-сервисную обертку. Большая часть кода поколения, так как 2,0 будет записывать файлы в качестве partial классов, а значит, вы можете добавить второй файл кода, чтобы добавить такие вещи, как атрибуты:

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

Это сочетании с другой половиной в WSDL-порожденных типов , и должен сделать его пригодным для использования от BinaryFormatter - однако лично Я подозреваю, что это плохой способ сделать это. Поскольку вы используете wsdl.exe, ваши типы уже сериализуются через XmlSerializer. Вместо того, чтобы сериализовать их с помощью BinaryFormatter (это то, что будет использоваться по умолчанию и которое очень хрупкое), рассмотрите их сериализацию с помощью XmlSerializer до string или byte[] и добавьте , чтобы в состояние сеанса. Это будет работать без дополнительных изменений кода, и будет намного более надежным, так как это позволит избежать множества хрупких точек 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

Спасибо за очень подробный пост и образец кода, он поставил меня на правильный путь. :) –