问题 将自定义对象传递给Web服务


我需要将自定义对象传递给远程Web服务。我已经读过可能有必要实现ISerializable,但我已经这样做了,而且遇到了困难。 C#将自定义对象传递给Web服务方法的正确方法是什么?


7119
2018-06-03 22:46


起源

如果您能够具体了解您遇到的困难,可能会更好。你想做什么,真的吗?也许一些具体的例子会有所帮助“传递自定义对象”是什么意思?这可能意味着许多事情。一些细节会有所帮助。 - Cheeso


答案:


作为服务请求的一部分提供的参数必须使用[Serializable]标记,并且基于之前发布的一些答案,您还需要确保自定义对象在构造函数中不包含任何参数。

还要记住,您在类中的任何逻辑都不会在客户端创建的代理类中创建。您将在客户端看到的所有内容都是默认构造函数和属性。因此,如果向自定义对象添加方法,请记住客户端不会看到它们或能够使用它们。

对于任何可能放入任何属性的逻辑,同样如此。

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

7
2018-06-03 23:32



吉姆,对不起,但[Serializable]与网络服务无关。 - John Saunders
@John:为什么不呢? XmlSerializer是否也依赖于[Serializable]属性? - fretje
添加了示例。当需要序列化自定义对象时,我一直使用[Serializable]属性。 - Jim Scott
@fretje:不,它没有。看到 msdn.microsoft.com/en-us/library/182eeyhh(VS.85).aspx。 - John Saunders
@Jim:尝试删除[Serializable]并查看它是否仍然有效。 - John Saunders


看起来像是重复的

无论如何,WS交互中涉及的所有对象都应该是XML可序列化的,而不是ISerializable(这是二进制序列化)。此外,它们应该在服务契约(WSDL)中描述,否则客户端将无法使用它们。 本文 应该有助于理解XML Web服务的XML序列化。

但是,如果你在谈论 真的定制 对象(即任何类型)。您应该考虑以二进制形式传递它们:或者作为base64编码,或者作为附件。我链接的问题有一个答案如何做到这一点。


5
2018-06-03 22:58





看这个  了解如何为自定义对象实现XML序列化


0
2018-06-03 23:28





编辑:删除了关于[Serializable]的部分

您是在创建服务还是正在使用它?

要创建可以作为web方法的参数传递的对象,您不必执行任何特殊操作。那就是你要创建一个asmx webservice。

OTOH,如果您正在创建WCF服务,那么您必须使用[DataContract]标记该类,并使用[DataMember]标记要序列化的所有成员。

如果您正在使用Web服务,则在添加服务引用时应生成要传递的对象的代理类。你只需要使用它们。


0
2018-06-03 22:51



其实我都在制作和消费。你在这里提到的是我一直在做的事情,但是我一直抱怨VS在自定义对象中需要一个无参数的构造函数(我已添加,但无济于事)。 - Ben Lakey
那么你能提供相关的代码吗? 投诉 ;-) - fretje