1

我正在使用 wsdl.exe 从一个巨大的 wsdl 文件中自动生成 Web 服务代理代码。然后,我将它生成的 .cs 文件编译为 dll 并在我的程序中使用它来进行 Web 服务调用。

问题是在我的程序中使用 sql 会话状态时,我无法将代理对象保存到会话状态。我在 wsdl.exe 生成的文件中将主类标记为可序列化,但没关系,因为它继承了不可序列化的 System.Web.Services.Protocols.SoapHttpClientProtocol?

有谁知道让自动生成的代码与会话状态一起工作的方法?

4

1 回答 1

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(这是默认使用的,而且非常脆弱),而是考虑通过XmlSerializerastring或 a序列化它们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);
    }
}
于 2009-10-14T03:59:05.727 回答