C# WCF使用接口参数调用服务方法会导致SocketException
我有一个WCF服务,其中我实现了一个带有out参数的服务方法,该参数的类型是这样一个接口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
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,这是迄今为止对我有效的方法,它不是一个合适的解决方案,因为这要求我有一个基类用于继承,尽管我想使用接口实现。我要补充一个关于我是如何做到这一点的答案。