2009-10-21 120 views
2

我正在使用ASP.NET C#創建一個Web服務。我從web服務發送各種數據類型,所以我使用以下結構。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; } 
} 

Webservice的抽樣方法

[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窗體。當我從javascript調用時,我沒有問題,並且osr.data被WS_User填充。所以我可以很容易地使用osr.data.id。但是,當我從C#.NET中使用我可以成功調用,但是當結果到達時,我得到一個SOAP異常

{System.Web.Services.Protocols.SoapException(使用「添加Web引用」生成代理): System.Web.Services.Protocols.SoapException: 服務器無法處理請求。 ---> System.InvalidOperationException:生成XML 文檔時發生錯誤。 ......

我在想什麼?我猜對象沒有很好的定義並導致問題。什麼是解決方法?

感謝

Maksud

增加:

如果添加下面的虛擬方法,那麼它工作得很好。希望它有助於獲得解決方案。

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

您是否爲C#生成代理客戶端? – 2009-10-21 06:43:27

+0

是的。我使用Add Web Reference來做到這一點。如果我返回osr.data =「abcd」; //對象是數據,那麼我不會例外。我得到結果=成功和數據=「abcd」;但是如果我使用WS_User對象,那麼我會陷入困境。 – max 2009-10-21 06:50:14

回答

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 2009-10-21 08:17:47

+0

我們是否需要改變「公共對象數據{get; set;}」 – Brian 2013-05-01 03:53:43

+0

如果我們將「data」更改爲「data []」,它會起什麼作用? – Brian 2013-05-01 03:54:06