如何使用可序列化的wsdl.exe生成Web服务代理代码

时间:2009-10-13 22:40:47

标签: c# asp.net serializable wsdl.exe

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

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

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

1 个答案:

答案 0 :(得分:1)

通常,您将序列化 state (实体),而不是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将其序列化为stringbyte[] ,并将 添加到会话状态。这将在没有额外代码更改的情况下工作,并且更加健壮,因为它避免了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);
    }
}