WCF调用带有Interface参数的服务方法会导致SocketException

时间:2018-07-17 19:05:25

标签: c# wcf

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

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

IFoo 是界面, AFoo 是继承的具体类型。

然后在客户端上,我使用服务引用调用此方法并收到以下错误

  

System.ServiceModel.CommunicationException:'发生错误,而   接收HTTP响应   http://localhost:4504/MyService。这可能是由于   服务端点绑定不使用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为什么不起作用?有任何想法吗?

3 个答案:

答案 0 :(得分:1)

看看另一个问题:DataContract and inheritance?

似乎您需要用子类的KnownType装饰基类才能执行此类操作,并且当然都将它们都放在DataContract下。

答案 1 :(得分:0)

我已经看到了这一点,因为该类型包含对#uploadedImg类型的引用,但未使用enum属性进行标记。您看到的错误很可能隐藏了这样的内部错误。有时,您可以转到Debug-> Exceptions并打开'break on all throwing exceptions'。

答案 2 :(得分:0)

解决方法

  

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

我终于开始工作了,我将分享我所做的事情。简而言之,我在 DataContract 中缺少 KnownType

首先,我必须按照问题部分中的说明添加基类 Foo 。接下来我有 将 KnownType 属性与所有Child(继承的)类一起添加,在我的例子中,它只是 AFoo

这是代码的样子

public interface IFoo
{
}

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

public class AFoo : Foo
{
}

现在服务方法如下:

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

一切都好!

如果有可能像下面这样的服务方法(不需要基类),那就很好了

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