1

在此处输入代码我想使用 .asvc Web 服务发送动态类型。我有一类有一些属性。我想发送任何类型的对象,甚至是这个列表中的类。并在客户端回退。

我的意思是我总是想使用SysResult类型。但有时与List<Apple>,有时List<Orrange>

像下面这样

    [Serializable]
    public class SysResult
    {
        public int CRCResult;
        public long CRCTransactionId;
        public bool CRCStatus;
        public string CRCMessage;
        public List<Anything> ListObject;
    }

我尝试使用object[], Array,List<object>dynamic。但我收到了这个错误。“底层连接已关闭:连接意外关闭。”

顺便为所有非特定对象类型服务引用类表示object[]类型。

  [System.Runtime.Serialization.DataMemberAttribute(IsRequired=true)]
        public object[] ListObject {
            get {
                return this.ListObjectField;
            }
            set {
                if ((object.ReferenceEquals(this.ListObjectField, value) != true)) {
                    this.ListObjectField = value;
                    this.RaisePropertyChanged("ListObject");
                }
            }
        }

有没有办法发送动态类型?还是我试图做一些完全错误的事情?

提前致谢。

4

2 回答 2

2

您必须返回已知类型。它不能只返回“对象”甚至接口。如果没有数据契约,wcf 怎么知道在客户端将对象序列化成什么?

通常,在客户端和服务之间传递参数和返回值时,两个端点共享要传输的数据的所有数据协定。但是,在以下情况下并非如此:

...要传输的信息的声明类型是Object。因为每种类型都继承自 Object,并且无法提前知道实际发送的是哪种类型,所以接收端点无法提前确定传输数据的数据协定。

http://msdn.microsoft.com/en-us/library/ms730167(v=vs.110).aspx

您可以使用 KnownTypes 来映射您的接口和对象。看看这个链接: WCF - Object as known type -> interoperable? WCF、接口返回类型和 KnownTypes

于 2014-04-15T11:53:06.107 回答
1

这可能会给您手头的问题一些帮助

WCF 不支持使用泛型方法进行服务操作。换句话说,只有具体的类型可以用于服务操作。不能使用开放的泛型类型。现在,重要的是要澄清这不是 WCF 的限制。相反,它是 WSDL 的限制,它用于向消费者公开服务元数据。WSDL 中没有定义泛型类型的构造。一般来说,我同意这种行为,因为它减少了客户端和服务之间的耦合。

尽管不支持泛型方法,但可以公开泛型对象以交换数据。但是,有一些限制。让我们仔细看看:

http://jeffbarnes.net/blog/post/2007/05/10/WCF-Serialization-and-Generics.aspx

于 2014-04-15T11:44:32.670 回答