繁体   English   中英

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

[英]How to generate web service proxy code with wsdl.exe that is serializable

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

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

有谁知道一种使自动生成的代码在会话状态下工作的方法?

通常,您将序列化状态 (实体),而不是WSDL服务包装器。 自2.0以来的大多数代码生成都将文件编写为partial类,这意味着您可以添加第二个代码文件来添加诸如属性之类的东西:

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

这与wsdl生成的类型中的另一半结合使用,应该可以从BinaryFormatter使用它-但是,我个人认为这样做是一种不好的方法。 由于您使用的是wsdl.exe,因此您的类型已经可以通过XmlSerializer进行序列化。 可以使用XmlSerializer将它们序列化为stringbyte[] ,然后将添加到会话状态,而不是使用BinaryFormatter序列化它们(默认情况下会使用它,并且它非常脆弱)。 这将无需更改任何代码即可工作,并且更加健壮,因为它避免了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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM