2009-06-03 228 views
9

我需要將自定義對象傳遞給遠程Web服務。我已經讀過可能需要實現ISerializable,但是我已經完成了這一步,而且遇到了困難。 C#中將自定義對象傳遞給Web服務方法的正確方法是什麼?C#.NET Web服務 - 將自定義對象傳遞給Web服務

+0

它可能會更好,如果你能具體瞭解您所遇到的困難。你想做什麼,真的嗎?也許一些具體的例子會有幫助。 「傳遞自定義對象」是什麼意思?這可能意味着很多事情。一些細節會有所幫助。 – Cheeso 2009-06-04 01:49:35

回答

6

您提供的參數作爲服務請求的一部分,必須標有[可序列化],並根據一些公佈答案的對象在我之前,您還需要確保您的自定義對象在構造函數中不包含任何參數。

還要記住在類中創建的任何邏輯都不會在客戶端創建的代理類中創建。您將在客戶端看到的所有內容都是默認的構造函數和屬性。因此,如果您向自定義對象添加方法,請記住客戶端不會看到它們或無法使用它們。

同樣的事情適用於您可能放入任何屬性的任何邏輯。

[Serializable] 
public class Customer 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 
+4

吉姆,對不起,但[序列化]與Web服務無關。 – 2009-06-03 23:35:46

+0

@John:爲什麼不呢?XmlSerializer是否也依賴於[Serializable]屬性? – fretje 2009-06-03 23:45:25

+0

新增示例。當需要序列化自定義對象時,我始終使用[Serializable]屬性。 – 2009-06-03 23:52:02

0

編輯:刪除了關於[Serializable]的部分

您是在創建服務還是在使用它?

要創建一個可以作爲webmethod的參數傳遞的對象,您不必做任何特殊的事情。這就是如果你正在創建一個asmx web服務。

OTOH,如果你正在創建一個WCF服務,那麼你必須用[DataContract]標記這個類,並且你想用[DataMember]序列化所有的成員。

如果您使用的是webservice,則應在添加服務引用時生成要傳遞的對象的代理類。你只需要使用它們。

+0

其實我都在製作和消費。你在這裏提到的是我一直在做的事情,但我不斷收到VS關於在自定義對象中需要一個無參數構造函數的抱怨(我已經添加了這個函數,但無濟於事)。 – 2009-06-03 22:54:56

+0

然後你可以提供相關的代碼和確切的*投訴* ;-) – fretje 2009-06-03 22:56:53

5

看起來像一個重複這個question

無論如何,參與WS交互的所有對象應該是XML序列化,不ISerializable的(這是二進制序列化)。而且,它們應該在服務合同(WSDL)中進行描述,否則客戶端將無法使用它們。 This article對於理解XML Web服務的XML序列化應該很有用。

但是,如果您正在談論真的定製對象(即任何類型)。您應該考慮以二進制形式傳遞它們:或者以base64編碼,或作爲附件。我鏈接到的問題有一個答案如何做到這一點。

0

看這個question,看看如何實現XML序列化的自定義對象