2009-06-03 132 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序列化的自定义对象