[英]Passing object through a webservice with SOAP in C#
我正在研究服务器客户端应用程序。 使用webservice web方法完成通信。 服务器和客户端都是用C#编写的。 我已经和它斗争了几天,但我无法解决它。
我在通过Web服务发送复杂的类时遇到了问题-到目前为止,我已经尝试了很多方法,但是没有一个起作用。
每个网络方法都返回如下的ServiceResult类:
public class ServiceResult
{
public ResultStatus Status;
public object ResultObject;
public ServiceResult(ResultStatus status, object resultObject)
{
Status = status;
ResultObject = resultObject;
}
}
ResultStatus是枚举,ResultObject是实际的返回值。 当我试图通过webservice发送复杂的类时,问题出现了。
例如,我有抽象类Job,它有私有元素。
public abstract class Job : IComparable<Job>
{
public static readonly int DefaultDelay = 5000;
private int _jobID;
private int _referringID;
private JobType _jobType;
protected JobState _jobState;
private JobPriority _jobPriority;
[...]
}
但是,当我尝试通过网络方法发送继承Job类(称为JobA)的类时,出现了错误。 因为在任何Web方法中都没有显式的JobA返回类型,所以当我调用Web方法时会收到错误消息:
System.Web.Services.Protocols.SoapException:服务器无法处理请求。 ---> System.InvalidOperationException:生成XML文档时出错。 ---> System.InvalidOperationException:在此上下文中不能使用Job []类型。
那是关于第一个错误。 现在不同类有另一个问题,其中错误看起来像这样(再次,当调用webmethod时):
System.Web.Services.Protocols.SoapException:服务器无法处理请求。 ---> System.InvalidOperationException:生成XML文档时出错。 ---> System.InvalidOperationException:不期望该类型。 使用XmlInclude或SoapInclude属性可以指定静态未知的类型。
当我添加[SoapInclude(typeof(MyClass))]时它没有区别,但是使用XmlInclude来生成我的ServiceResult.ResultObject XmlNodes数组。
我认为这两个问题都与序列化有关,但我不知道如何解决它们。 基本上,我的问题是:如何通过webmethod以如此方式将自定义对象从服务器传递到客户端,以便我可以将它们用作对象(我想将此ServiceResult.ResultObject强制转换为类并将其用作偶然的实例那个班)? 最好的方法是什么?
有人可以提出任何解决方案吗?
基于初始错误消息,听起来您可能在您尝试序列化的类中有一个属性是Job
的数组或集合,这将导致您看到的异常。
如果不应该序列化此属性,则可以使用XmlIgnore
属性对其进行装饰。
此外,当我尝试调试Web服务序列化的问题时,我通常使用XmlSerializer来序列化我的Web服务类的实例,然后再尝试将它们连接到Web方法。 有时,您可以获得有关失败原因的更明确的信息,并查看序列化的输出,以确定元素可能未按预期序列化的位置。
这是一个可用于此的小测试方法:
/// <summary>
/// This method serializes objects to an XML string using the XmlSerializer
/// </summary>
/// <returns></returns>
/// <remarks></remarks>
public string SerializeObjectToXMLString(object theObject)
{
// Exceptions are handled by the caller
using (System.IO.MemoryStream oStream = new System.IO.MemoryStream())
{
System.Xml.Serialization.XmlSerializer oSerializer = new System.Xml.Serialization.XmlSerializer(theObject.GetType());
oSerializer.Serialize(oStream, theObject);
return Encoding.Default.GetString(oStream.ToArray());
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.