C# ASP.NET Web服务忽略[NonSerialized]钩子

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服务似乎没有遵守我的指示

我正试图在ASP.NET中使用C#实现一个SOAP服务,这样我就可以用Flex使用它了——但这是下一步。我遇到的问题是,我试图与一个服务器端类通信,该类在
[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
。。。。