0

我正在尝试使用 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)。

现在,我知道XmlNamespaceManagers 是不可序列化的,所以我试图指出这一点,但是出了点问题,我不知道该怎么办。

请帮忙?:D

4

1 回答 1

1

我已经设法重现了您的问题,并且在我的小测试中似乎已经解决了它...

我最初遇到了与您相同的错误,但这里重要的不是错误,而是堆栈跟踪。这是我得到的一个小片段,我希望你会看到类似的东西:

System.Xml.Serialization.TypeScope.GetEnumeratorElementType(Type type, TypeFlags& flags) +1354352
System.Xml.Serialization.TypeScope.ImportTypeDesc(Type type, MemberInfo memberInfo, Boolean directReference) +5553239

所以我们在这里得到一个提示,正在使用的序列化器是基于堆栈跟踪中引用的命名空间的XmlSerializer 。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”。

于 2013-03-22T06:33:14.877 回答