如何生成与Wsdl.exe用Web服务代理代码是序列化
-
21-09-2019 - |
题
我使用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
序列化。相反,与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);
}
}
不隶属于 StackOverflow