Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF、接口返回类型和KnownTypes_C#_Visual Studio_Wcf_Visual Studio 2010 - Fatal编程技术网

C# WCF、接口返回类型和KnownTypes

C# WCF、接口返回类型和KnownTypes,c#,visual-studio,wcf,visual-studio-2010,C#,Visual Studio,Wcf,Visual Studio 2010,我正在创建一个WCF服务,在一些序列化问题上遇到了很多麻烦。也许只有一种方法,但我想确认一下 以下是我的示例代码: 合同 public interface IAtm { [DataMember] double Latitude { get; set; } [DataMember] double Longitude { get; set; } } [ServiceContract] public inter

我正在创建一个WCF服务,在一些序列化问题上遇到了很多麻烦。也许只有一种方法,但我想确认一下 以下是我的示例代码:

合同

public interface IAtm
    {
        [DataMember]
        double Latitude { get; set; }

        [DataMember]
        double Longitude { get; set; }
    }

[ServiceContract]
    public interface IAtmFinderService
    {

        [OperationContract]
        ICollection<IAtm> GetAtms();

    }
尝试调用时,我遇到以下错误:

InnerException消息为“类型” 具有数据协定名称的“WCFTest.Atm” “自动取款机:http://schemas.datacontract.org/2004/07/WCFTest' 这是预料不到的。考虑使用 DataContractResolver或添加任何类型 列表中静态未知的 已知类型-例如,通过使用 KnownTypeAttribute属性或由 将它们添加到已知类型列表中 已传递给DataContractSerializer。“

非常好。。。所以,我认为VS的自动生成代码是垃圾。我对我的服务(以及所有相关的类和实现)做了以下更改:

[运营合同]
i收集GetAtms();
现在,我返回一个具体的类型。在更新服务引用之后,它创建了一个Atm类的副本及其成员和内容。 调用服务后,调用成功。 我认为这是一些与自动生成代码相关的不良行为,因此我尝试创建一个非常简单的主机/客户端应用程序。我启动了一个控制台主机,监听某个端口,然后创建了一个客户端,该客户端使用ClientBase类调用该服务。同样的行为。。。如果实现的服务返回接口类型,则会失败。如果我将其更改为返回混凝土类型,它将工作。我想我在KnownType属性方面有一些问题,我肯定缺少序列化程序无法处理的内容。但我不知道是什么。

好的,我设法修好了 在我看来,问题在于

因为我返回的是一个接口,而不是一个具体的类,所以WCF不知道在另一端会发生什么。所以,它可以是任何东西。当他得到一个列表时,他会感到困惑。
正确的方法是在需要的地方添加KnownType属性
谁需要知道这些类型?服务实现,以正确地序列化和反序列化它们。但是,客户机与服务接口进行对话,而不是与实现本身进行对话。这就是为什么在服务实现中添加KnownType属性不起作用的原因
这里的问题是,接口不允许KnownType属性,但允许ServiceKnownType属性。问题的解决方案是在服务接口契约中添加预期的类型,瞧,一切正常,使用接口

    [ServiceContract]
    [ServiceKnownType(typeof(Atm))]
    [ServiceKnownType(typeof(List<Atm>))]
    public interface IAtmFinderService
    {

        [OperationContract]
        ICollection<IAtm> GetAtms();

    }
[服务合同]
[ServiceKnownType(类型(Atm))]
[ServiceKnownType(类型(列表))]
公共接口IATMFinder服务
{
[经营合同]
i收集GetAtms();
}

+1感谢您的修复,我遇到了同样的问题,但只需要为我的自定义页面列表实现添加列表实现。我的“T”是一个域对象,已经为我正确序列化了。
object[] GetAtms();
[OperationContract]
        ICollection<Atm> GetAtms();
    [ServiceContract]
    [ServiceKnownType(typeof(Atm))]
    [ServiceKnownType(typeof(List<Atm>))]
    public interface IAtmFinderService
    {

        [OperationContract]
        ICollection<IAtm> GetAtms();

    }