Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.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使用接口参数调用服务方法会导致SocketException_C#_Wcf - Fatal编程技术网

C# WCF使用接口参数调用服务方法会导致SocketException

C# WCF使用接口参数调用服务方法会导致SocketException,c#,wcf,C#,Wcf,我有一个WCF服务,其中我实现了一个带有out参数的服务方法,该参数的类型是这样一个接口 bool GetFoo(out IFoo foo) { foo = new AFoo(); return true; } bool GetFoo(out Foo foo) { foo = new AFoo(); return true; } 这里,IFoo是接口&AFoo是继承的具体类型 然后在客户端,我使用服务引用调用这个方法&接收以下错误 System.Service

我有一个WCF服务,其中我实现了一个带有out参数的服务方法,该参数的类型是这样一个接口

bool GetFoo(out IFoo foo)
{
    foo = new AFoo();
    return true;
}
bool GetFoo(out Foo foo)
{
    foo = new AFoo();
    return true;
}
这里,IFoo是接口&AFoo是继承的具体类型

然后在客户端,我使用服务引用调用这个方法&接收以下错误

System.ServiceModel.CommunicationException:'在运行时发生错误 接收对的HTTP响应 . 这可能是由于 未使用HTTP协议的服务端点绑定。这也可能 可能是由于服务器中止了HTTP请求上下文 (可能是由于服务关闭)。有关更多信息,请参阅服务器日志 细节。”

有趣的是,当我从服务方法中删除接口参数时,一切正常。比如说

bool GetFoo()
{
    IFoo foo = new AFoo();
    return true;
}
AFoo类型已经是客户端的已知类型,我可以正常使用它


更新1

添加一个基类Foo,以便Afoo从Foo继承&Foo从IFoo继承 例如:AFoo:Foo:IFoo(逻辑上)在将服务方法修改为

bool GetFoo(out Foo foo)
{
    foo = new AFoo();
    return true;
}
我再次将所有类和接口保持为空(这意味着它们内部没有任何内容)


更新2

下面的方法似乎非常有效

bool GetFoo(out AFoo foo)
{
    foo = new AFoo();
    return true;
}

为什么基类Foo不起作用?有什么想法吗?

我看到了这一点,因为该类型包含对未标记有
DataContract
属性的
enum
类型的引用。您看到的错误很可能隐藏了这样的内部错误。有时,您可以通过转到Debug->Exceptions并启用“中断所有抛出的异常”来捕获这些异常。

看看另一个问题:


似乎您需要使用子类的
KnownType
来装饰基类来完成这类工作,当然,还需要将它们都放在
DataContract
下。

解决方法

注意:这不是答案,因为它强制创建基类

我终于成功了,我要和大家分享我所做的。简而言之,我在数据契约中缺少了知识类型

首先,我必须添加一个基类Foo,如问题部分所述。接下来我有 要在所有子(继承的)类中添加KnownType属性,在我的例子中,它只是AFoo

下面是代码的样子

public interface IFoo
{
}

[DataContract]
[KnownType(typeof(AFoo))]
public class Foo : IFoo
{ // this is the Base Class
}

public class AFoo : Foo
{
}
现在服务方法如下所示

bool GetFoo(out IFoo foo)
{
    foo = new AFoo();
    return true;
}
bool GetFoo(out Foo foo)
{
    foo = new AFoo();
    return true;
}
一切都好!! 如果可以使用如下的服务方法(不需要基类),那就太好了


您是否尝试将
移出
?AFoo类是否用DataContract属性修饰?out不是问题。为什么,因为我所有的服务方法都有out参数,而且工作正常。正如我所说的,AFoo已经是一种已知的类型。我甚至尝试从类AFoo中删除所有属性&接口IFoo,同样的resultThanks@Kevin,这是迄今为止对我有效的方法,它不是一个合适的解决方案,因为这要求我有一个基类用于继承,尽管我想使用接口实现。我要补充一个关于我是如何做到这一点的答案。