2011-12-07 113 views
1

我正在處理服務器客戶端應用程序。通信是使用webservice webmethods完成的。服務器和客戶端都是用C#編寫的。我已經與它戰鬥了幾天,但我無法解決它。在C中使用SOAP通過web服務傳遞對象#

我有問題通過webservice發送複雜的類 - 我到目前爲止嘗試了很多東西,但都沒有工作。

每一個的WebMethod返回ServiceResult類,看起來像這樣:

public class ServiceResult 
    { 
     public ResultStatus Status; 
     public object ResultObject; 

     public ServiceResult(ResultStatus status, object resultObject) 
     { 
      Status = status; 
      ResultObject = resultObject; 
     } 
    } 

ResultStatus是枚舉,ResultObject是實際返回的值。當我嘗試通過webservice發送複雜類時,問題就出現了。

例如,我有抽象類Job,它具有私有元素。

public abstract class Job : IComparable<Job> 
{ 
    public static readonly int DefaultDelay = 5000; 

    private int _jobID; 
    private int _referringID; 
    private JobType _jobType; 
    protected JobState _jobState; 
    private JobPriority _jobPriority; 
    [...] 
} 

但是,當我嘗試發送類繼承Job類(我們稱之爲JobA)通過webmethod我有錯誤。因爲我有任何的WebMethod沒有明確職吧返回類型,當我把我的webmethod我得到一個錯誤:

System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: The type Job[] may not be used in this context.

這是關於第一個錯誤。現在有不同的類,其中的錯誤看起來是這樣的(再次,調用一個WebMethod時)另外一個問題:

System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: The type was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.

當我添加[SoapInclude(typeof運算(MyClass的))]有沒有什麼區別,但使用XmlInclude而是使我的ServiceResult.ResultObject數組的XmlNodes。

我認爲這兩個問題都是關於序列化的,但我不知道如何解決它們。基本上,我的問題是:我應該如何通過webmethod以這種方式將自定義對象從服務器傳遞到客戶端,以便我可以將它們用作對象(我想將此ServiceResult.ResultObject強制轉換爲類,並將其用作類的臨時實例那個班)?什麼是最好的方式來做到這一點?

任何人都可以提出任何解決方案嗎?

+2

你堅持使用.NET 2.0?如果不是,那麼你不應該使用傳統的ASMX網絡服務。你應該使用WCF進行所有新的開發。 –

+0

嗯,我認爲這會更容易,因爲我還沒有使用WCF。但似乎可能會更快。 – msu

+0

「更容易」,是的,因爲它功能少得多,可擴展性也少得多。一個好主意,不,因爲它沒有未來,甚至沒有任何錯誤修復。 –

回答

3

根據初始錯誤消息,聽起來好像您可能在您想要序列化的類中有一個屬性爲Job的數組或集合,這會導致您看到的異常。

如果這個屬性不應該被序列化,那麼你可以用XmlIgnore屬性來修飾它。另外,當我嘗試調試Web服務序列化的問題時,我通常使用XmlSerializer在嘗試將它們連接到Web方法之前序列化我的Web服務類的實例。有時,您可以獲得有關失敗的更多明確信息,並查看序列化輸出以確定元素可能無法序列化的位置,如您所期望的那樣。

這裏是一個小的測試方法,您可以使用此:

/// <summary> 
    /// This method serializes objects to an XML string using the XmlSerializer 
    /// </summary> 
    /// <returns></returns> 
    /// <remarks></remarks> 
    public string SerializeObjectToXMLString(object theObject) 
    { 
     // Exceptions are handled by the caller 

     using (System.IO.MemoryStream oStream = new System.IO.MemoryStream()) 
     { 
      System.Xml.Serialization.XmlSerializer oSerializer = new System.Xml.Serialization.XmlSerializer(theObject.GetType()); 

      oSerializer.Serialize(oStream, theObject); 

      return Encoding.Default.GetString(oStream.ToArray()); 
     } 
    } 
+0

謝謝,這是有用的方法。然而,我仍然得到相同的錯誤 - 當方法試圖返回(空)的項目數組作業。第二件事是,使用這個序列化器,我沒有得到私人領域。 – msu

+0

@msu:項目的重新排列:我認爲您需要使用XMLInclude屬性來指定Job類,以指定將包含的每個具體類(http://www.geekzilla.co.uk/viewA9CF69B4-0C40-4CEE -A590-496D9EB09C0E.htm)。重新序列化程序:您將永遠不會在Web服務中獲得私有字段,這就是爲什麼使用XMLSerializer進行測試非常重要,因爲這是Web服務使用的原因。如果可以,我強烈建議至少升級到.Net 3.5並使用WCF。 –

+0

再次感謝。我升級到WCF,但錯誤仍然存​​在 - 它回來了,因爲我沒有將每個繼承的Job類添加到[KnownType]屬性。它現在有效。 – msu

相關問題