【问题标题】:ASP.NET Web Service ignores [NonSerialized] hookASP.NET Web 服务忽略 [NonSerialized] 挂钩
【发布时间】:2013-03-22 05:30:06
【问题描述】:

我正在尝试使用 C# 在 ASP.NET 中实现一个 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)。

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

请帮忙? :D

【问题讨论】:

  • 此外,我也尝试过制作自己的XmlNamespaceManager,它继承了原版并实现了Add,但当然,原版仍然没有实现Add。跨度>

标签: c# asp.net serialization soap


【解决方案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”。

【讨论】:

  • 这个。 Soap 是 xml 格式,因此使用 xml 序列化属性。
  • 非常感谢!这正是我一直在寻找的。 :) 虽然 SOAP 服务默认不使用 SoapFormatter 不是很奇怪吗?
  • 这可能是因为 SoapFormatter 自 .NET 2.0 以来已被弃用,但由于名称被采用,他们无法命名替换序列化程序 SoapFormatter....
猜你喜欢
  • 2020-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
  • 2020-05-23
  • 1970-01-01
  • 2013-11-17
相关资源
最近更新 更多