我正在尝试使用C#在ASP.NET中实现SOAP服务,因此我可以使用Flex来使用它 - 但这是下一步。我遇到的问题是我正在尝试与XmlNamespaceManager
类中具有[Serializable]
字段的服务器端类进行通信:
[Serializable]
public class Site {
...
public XmlNamespaceManager xmlNS;
...
}
我尝试将[NonSerialized]
挂钩附加到有问题的字段上,但我的SOAP服务似乎没有遵守我的指示。这是服务:
public class DotNetWikiService : WebService
{
[WebMethod]
public Article doWork(Site ws, String title)
{
Page thePage = new Page(ws, title);
thePage.Load();
if (thePage.Exists() == false)
{
return new Article(title, "Wiki page contents are empty.");
}
return new Article(title, thePage.text);
}
}
这是我尝试运行.asmx文件时出现的错误:
要成为XML可序列化,从IEnumerable继承的类型必须具有 Add(System.Object)在其继承的所有级别上的实现 层次结构。 System.Xml.XmlNamespaceManager不实现Add(System.Object)。
现在,我知道XmlNamespaceManager
s不可序列化,所以我试图表明这一点,但是出了点问题,我不知道该怎么做。
请帮忙吗? :d
答案 0 :(得分:1)
我设法重现了你的问题,在我的小测试中似乎解决了它......
我得到了与你最初相同的错误,但这里重要的不是错误而是堆栈跟踪。这里有一些我得到的东西,我希望你会看到类似的东西:
System.Xml.Serialization.TypeScope.GetEnumeratorElementType(Type type, TypeFlags& flags) +1354352
System.Xml.Serialization.TypeScope.ImportTypeDesc(Type type, MemberInfo memberInfo, Boolean directReference) +5553239
所以我们在这里得到一个提示,正在使用的序列化程序是基于System.Xml.Serialization
命名空间的XmlSerializer,它在堆栈跟踪中被引用。但是,如果我们看看[NonSerialize]
attribute,我们可以在注释中看到它适用于BinaryFormatter和SoapFormatter,但是当我们想要使用XmlSerializer类时。在这种情况下,我们必须使用this属性。
执行此操作会将此公共成员的定义转换为:
[XmlIgnore]
public XmlNamespaceManager xmlNS;
我做了一个小测试课:
[Serializable]
public class Site
{
public string X { get; set; }
[XmlIgnore]
public XmlNamespaceManager xmlNS;
}
并从服务方法返回:
[WebMethod]
public Site HelloWorld()
{
Site toReturn = new Site();
toReturn.X = "hello world";
return toReturn;
}
跑了起来,它出现在浏览器中。测试了该方法,它在SOAP结构中返回了“hello world”。