如何在Web服务中公开接口

时间:2012-03-07 12:16:13

标签: c# wcf interface

我希望在我的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;
    }
}

但没有成功!

2 个答案:

答案 0 :(得分:9)

所有WCF合约参数和返回类型都必须是可序列化的;接口不是。 This question以围绕KnownType属性的答案探讨同一问题;如果您要传回IMyObject的各种实现,我建议您这样做,否则您必须将返回类型更改为MyObject

答案 1 :(得分:1)

有关序列化的附加说明 以下规则也适用于数据协定序列化程序支持的类型:

数据协定序列化程序完全支持通用类型。

数据协定序列化程序完全支持可空类型。

接口类型被视为Object,或者在集合接口的情况下,视为集合类型。

.....

查看完整MSDN Additional Notes on Serialization


修改

我猜你在谈论客户激活对象。要详细了解相关信息,请参阅以下帖子Returning an interface from a WCF service 您看到您只能通过WCF中的序列化发送数据,但没有实现。问题的另一个方面是使用实例化。