2013-03-22 4 views
0

Я пытаюсь реализовать SOAP-сервис в ASP.NET с использованием C#, чтобы я мог использовать его с помощью Flex, но это следующий шаг. Проблема у меня в том, что я пытаюсь общаться с классом на стороне сервера, который имеет XmlNamespaceManager поле внутри [Serializable] класса:ASP.NET Web Service игнорирует [NonSerialized] hook

[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 должны иметь реализацию Добавить (System.Object) на всех уровнях их наследования иерархия. System.Xml.XmlNamespaceManager не реализует Add (System.Object).

Теперь, я знаю, что XmlNamespaceManager s не сериализации, поэтому я попытался указать на это, но что-то происходит наперекосяк, и я не знаю, что делать.

Помогите, пожалуйста? : D

+0

Кроме того, я также попытался создать собственный XmlNamespaceManager, который наследует оригинал и реализует 'Add', но, конечно же, оригинал все еще не реализует' Add'. –

ответ

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]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-структуре.

+0

Это. Мыло представляет собой XML-формат и поэтому использует атрибуты сериализации xml. – JerKimball

+0

Спасибо большое! Это именно то, что я искал. :) Хотя разве не странно, что службы SOAP не используют «SoapFormatter» по умолчанию? –

+0

Скорее всего, потому, что 'SoapFormatter' устарел с .NET 2.0, но поскольку имя было принято, они не могли назвать заменяющий сериализатор' SoapFormatter' .... – nkvu