2009-10-21 4 views
2

Я создаю веб-службу с использованием ASP.NET C#. Я отправляю различные типы данных из webservice, поэтому я использую следующую структуру.C# .NET WebService возвращающий объект

public enum WS_ServiceResponseResult 
{ 
    Success, 
    Failure, 
} 
public class WS_ServiceResponse 
{ 
    public WS_ServiceResponseResult result { get; set; } 
    public object data { get; set; } 
} 

public class WS_User 
{ 
    public long id{ get; set; } 
    public string name{ get; set; } 
} 

Метод

[WebMethod(EnableSession = true)] 
    public WS_ServiceResponse LogIn(string username, string pasword) 
    { 
     WS_ServiceResponse osr = new WS_ServiceResponse(); 
     long userID = UserController.checkLogin(username, pasword); 

     if (userID != 0) 
     { 
      osr.result = WS_ServiceResponseResult.Success; 
      osr.data = new WS_User() { id = userID, name = username }; 
     } 
     else 
     { 
      osr.result = WS_ServiceResponseResult.Failure; 
      osr.data = "Invalid username/password!"; 
     } 
     return osr; 
    } 

Я использую два типа клиента, JavaScript и C# .NET формы Windows Webservice образца. Когда я вызываю из javascript, я не получаю никаких проблем, а osr.data заполняется WS_User. Поэтому я могу легко использовать osr.data.id. Но когда я использую из C# .NET (прокси генерируется с помощью «Add Web Reference») можно успешно назвать, но когда результат приходит я мыльный Exception

{System.Web.Services.Protocols.SoapException: System.Web.Services.Protocols.SoapException: Сервер не смог обработать запрос. ---> System.InvalidOperationException: произошла ошибка при создании документа XML . ... ...

Что мне не хватает? Объект Guess недостаточно четко определен и вызывает проблемы. Каковы обходные пути?

Благодаря

Максуд

Дополнение

Если добавить следующий фиктивный метод, то он прекрасно работает. Надеюсь, что это поможет, чтобы получить решение.

[WebMethod] 
    public WS_User Dummy() 
    { 
     return new WS_User(); 
    } 
+0

Вы создаете прокси-клиент для C#? –

+0

Да. Для этого я использовал Add Web Reference. Если я возвращаю osr.data = "abcd"; // то есть объект - это данные, то я не получаю исключения. Я получаю результат = успех и данные = "abcd"; Но если я использую объект WS_User, то у меня возникают проблемы. – max

ответ

4

У меня была аналогичная проблема, возвращающая «объект» (несколько классов возможных) Вот пример кода:

[Serializable()] 
[XmlRoot(ElementName="Object")] 
public sealed class XMLObject 
{ 

    private Object _Object; 

    [XmlElement(Type=typeof(App.Projekte.Projekt), ElementName="Projekt")] 
    [XmlElement(Type=typeof(App.Projekte.Task), ElementName="Task")] 
    [XmlElement(Type=typeof(App.Projekte.Mitarbeiter), ElementName="Mitarbeiter")] 
    public Object Object 
    { 
     get 
     { 
      return _Object; 
     } 
     set 
     { 
      _Object = value; 
     } 
    } 
} 

Я думаю, вы должны изменить свой код так:

[XmlRoot(ElementName="ServiceResponse")] 
public class WS_ServiceResponse 
{ 
    public WS_ServiceResponseResult result { get; set; } 

    [XmlElement(Type=typeof(WS_User), ElementName="WS_User")] 
    [XmlElement(Type=typeof(string), ElementName="Text")] 
    public object data { get; set; } 
} 
+0

Ваше решение отлично работает. И если мне нужен какой-то массив, тогда [XmlElement (Type = typeof (WS_User []), ElementName = "WS_User []")] также работает. Вау. – max

+0

Нужно ли нам изменить «данные об общедоступных объектах {get; set;}» – Brian

+0

Что он будет работать, если мы изменим «данные» на «данные []» – Brian

Смежные вопросы