我希望在我的WCF服务上有一个函数,其返回类型作为接口,但是当我从客户端调用它时,我收到System.Object
,而不是实现服务发送的接口的类。
以下是一些示例代码:
[ServiceContract]
public interface IService
{
[OperationContract]
string SayHello();
[OperationContract]
IMyObject GetMyObject();
}
public interface IMyObject
{
int Add(int i, int j);
}
[DataContract]
public class MyObject : IMyObject
{
public int Add(int i, int j)
{
return i + j;
}
}
在执行此服务时,我有:
public class LinqService : IService
{
public string SayHello()
{
return "Hello";
}
public IMyObject GetMyObject()
{
return new MyObject();
}
}
SayHello()
效果很好,但GetMyObject()
会返回System.Object
。如何更改此代码以便GetMyObject()
返回实现IMyObject
的对象?
修改1
更改了以下代码:
using System.Runtime.Serialization;
using System.ServiceModel;
[ServiceContract]
public interface IService
{
[OperationContract]
string SayHello();
[OperationContract]
IMyObject GetMyObject();
}
[ServiceKnownType(typeof(MyObject))]
public interface IMyObject
{
[OperationContract]
int Add(int i, int j);
}
[DataContract]
public class MyObject:IMyObject
{
public int Add(int i, int j)
{
return i + j;
}
}
但没有成功!
答案 0 :(得分:9)
所有WCF合约参数和返回类型都必须是可序列化的;接口不是。 This question以围绕KnownType
属性的答案探讨同一问题;如果您要传回IMyObject
的各种实现,我建议您这样做,否则您必须将返回类型更改为MyObject
。
答案 1 :(得分:1)
有关序列化的附加说明 以下规则也适用于数据协定序列化程序支持的类型:
数据协定序列化程序完全支持通用类型。
数据协定序列化程序完全支持可空类型。
接口类型被视为Object,或者在集合接口的情况下,视为集合类型。
.....
查看完整MSDN Additional Notes on Serialization
修改强>
我猜你在谈论客户激活对象。要详细了解相关信息,请参阅以下帖子Returning an interface from a WCF service 您看到您只能通过WCF中的序列化发送数据,但没有实现。问题的另一个方面是使用实例化。