我有一个 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为什么不起作用?有任何想法吗?
答案 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;
}