如何在Web服务中公开接口

man*_*ans 7 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在这项服务的实施中,我有:

public class LinqService : IService
{
    public string SayHello()
    {
        return "Hello";
    }

    public IMyObject GetMyObject()
    {
        return new MyObject();
    }
}
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

但没有成功!

Ste*_*kes 9

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