在WCF发送对象

本文关键字:对象 WCF | 更新日期: 2023-09-27 18:18:08

我通过WCF服务在另一台计算机上执行方法下面是我的代码的一个小例子:

对方法的调用:return pipeProxy.SystemRequest(InstanceName, MethodName, Parameters);

方法和接口:

[ServiceContract]
    public interface IBlissRequest
    {
        [OperationContract]
        object SystemRequest(string InstanceName, string MethodName, object[] Parameters);
    }
    public class BlissRequest : IBlissRequest
    {
        public object SystemRequest(string InstanceName, string MethodName, object[] Parameters)
        {
            return System21.BlissProcessingUnit.BPU.RequestFromIBC(InstanceName, MethodName, Parameters); ;
        }
    }

正如你所看到的,我发送2个字符串,一个对象数组,我得到一个对象,这个方法被不同的位置调用,对象可以是不同的,如果我通过这个方法发送字符串或整数,一切都很好,但是当我试图发送一个列表的时候,事情就变坏了,这个方法不能执行。现在我读到标准DataContractSerializer被使用,我需要将其转换为XmlSerializer以使其工作。我找到了http://msdn.microsoft.com/en-us/library/ms733901.aspx,但是我不能让我的例子起作用。有人能给我指个好方向吗?

这是被抛出的异常:

在尝试序列化参数http://tempuri.org/:Parameters时发生错误。InnerException消息是'Type 'System. collections . generic . list ' 1[[System. collections . generic . list]。字符串,mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]',数据合约名称'ArrayOfstring:http://schemas.microsoft.com/2003/10/Serialization/Arrays'不需要。考虑使用DataContractResolver或将任何未知类型静态地添加到已知类型列表中—例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。详情请参见InnerException。

内部异常:

{"类型的System.Collections.Generic.List 1[[系统。字符串,mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]',数据合约名称'ArrayOfstring:http://schemas.microsoft.com/2003/10/Serialization/Arrays'不需要。考虑使用DataContractResolver或将任何未知类型静态地添加到已知类型列表中—例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。"}

需要发送的对象是:如果它是可能的一切,如果不只是所有正常的c#的东西,如Lists

在WCF发送对象

当以多态方式代替其他集合或集合接口时,不需要向已知类型添加集合类型。例如,如果声明了IEnumerable类型的数据成员并使用它来发送ArrayList的实例,则不需要将ArrayList添加到已知类型中。

当您以多态方式使用集合来代替非集合类型时,必须将它们添加到已知类型中。例如,如果你声明了Object类型的数据成员,并使用它来发送ArrayList的实例,请将ArrayList添加到已知类型中。

这不允许您以多态方式序列化任何等效集合。例如,当您将ArrayList添加到已知类型列表时,这并不允许您分配Array of Object类,即使它具有等效的数据契约。这与非集合类型序列化时的常规已知类型行为没有什么不同,但在集合的情况下,理解这一点尤为重要,因为集合通常是等价的。

在序列化过程中,对于给定的数据契约,在任何给定范围内只能知道一种类型,并且等效集合都具有相同的数据契约。这意味着,在前面的例子中,不能将ArrayList和Array of Object同时添加到同一作用域的已知类型中。同样,这与非集合类型的已知类型行为是等价的,但是对于集合来说,理解这一点尤为重要。集合的内容也可能需要已知类型。例如,如果ArrayList实际上包含Type1和Type2的实例,则这两种类型都应该添加到已知类型中。

你可以在这里找到一个例子,在集合和已知类型