C# ASP.NET Web服务忽略[NonSerialized]钩子
我正试图在ASP.NET中使用C#实现一个SOAP服务,这样我就可以用Flex使用它了——但这是下一步。我遇到的问题是,我试图与一个服务器端类通信,该类在C# ASP.NET Web服务忽略[NonSerialized]钩子,c#,asp.net,serialization,soap,C#,Asp.net,Serialization,Soap,我正试图在ASP.NET中使用C#实现一个SOAP服务,这样我就可以用Flex使用它了——但这是下一步。我遇到的问题是,我试图与一个服务器端类通信,该类在[Serializable]类中有一个XmlNamespaceManager字段: [Serializable] public class Site { ... public XmlNamespaceManager xmlNS; ... } 我尝试将[NonSerialized]钩子附加到有问题的字段上,但我的SOAP服务似乎没有遵守我的指示
[Serializable]
类中有一个XmlNamespaceManager
字段:
[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是不可序列化的,所以我试图指出这一点,但有些地方出了问题,我不知道该怎么办
请帮忙我设法重现了你的问题,在我的小测试中似乎解决了它 我得到了与您最初相同的错误,但这里重要的不是错误,而是堆栈跟踪。这是我得到的一个小片段,我想你会看到类似的东西:
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
命名空间。但是,如果我们看一下[NonSerialize]
,我们可以在注释中看到它适用于BinaryFormatter和SoapFormatter,但不适用于我们想要使用XmlSerializer类的时候。在这种情况下,我们必须使用属性
这样做会将您对此公共成员的定义转换为:
[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”。此外,我还尝试制作了自己的
XmlNamespaceManager
,它继承了原来的方法并实现了Add
,但当然,原来的方法仍然没有实现Add
。这就是。Soap是一种xml格式,因此使用xml序列化属性。非常感谢!这正是我想要的。:)虽然SOAP服务在默认情况下不使用SoapFormatter
不是很奇怪吗?这可能是因为SoapFormatter
自.NET 2.0以来就被弃用了,但是自从取了这个名称之后,他们就无法命名替换的序列化程序SoapFormatter
。。。。