Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在web服务中公开接口_C#_Wcf_Interface - Fatal编程技术网

C# 如何在web服务中公开接口

C# 如何在web服务中公开接口,c#,wcf,interface,C#,Wcf,Interface,我想在我的WCF服务上有一个函数,其返回类型作为接口,但是当我从客户端调用它时,我收到一个System.Object,而不是实现服务发送的接口的类 以下是一些示例代码: [ServiceContract] public interface IService { [OperationContract] string SayHello(); [OperationContract] IMyObject GetMyObject(); } public interfac

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

但是没有成功

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

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

数据协定序列化程序完全支持泛型类型

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

接口类型被视为对象,如果是集合接口,则被视为集合类型。

看到全部


编辑:

我猜你说的是客户端激活的对象。要了解更多信息,请参阅下面的帖子
您可以看到,您只能在WCF中通过序列化发送数据,而不能实现。解决问题的另一种方法是使用实例。

我可以问一下从WCF方法返回接口的目的吗?与从方法返回接口的目的相同:向WCF用户隐藏实现。为什么我的wcf用户应该知道我为接口实现的任何类?用户只需要知道对象提供了什么属性或方法。在我的例子中,我可能会根据一些参数返回IMyObject的不同实现。一般来说,这是一个好的意图,但毫无意义。调用方无论如何都不会看到任何“实现”。也不支持在
DataContract
中包含
OperationContract
。这两个概念实际上是不同的。您应该查看MSDN以了解更多信息。假设我的WCF需要返回一个实现了IComparable的类,但在设计阶段,我不知道返回哪个类,这将在运行时决定。我该怎么做呢?让我简单地说。类中唯一通过连接的是那些用DataMember属性注释的数据成员或字段。操作契约或方法不会通过线路传递给客户端。从纯设计的角度来看,您的问题“为什么我的wcf用户应该知道我为接口实现的任何类?”是完全正确的,但不幸的是,这只是WCF工作方式的一个事实。请尝试添加
KnownType
ServiceKnownType
属性,并将它们添加到
iSeries
而不是
IMyObject