【问题标题】:Passing Interface in a WCF Service?在 WCF 服务中传递接口?
【发布时间】:2008-11-21 20:54:24
【问题描述】:

我正在试验 WCF 服务,但在传递接口时遇到了问题。

这行得通:

[ServiceContract]
public interface IHomeService
{
    [OperationContract]
    string GetString();
}

但这不是:

[ServiceContract]
public interface IHomeService
{
    [OperationContract]
    IDevice GetInterface();
}

当我尝试编译客户端时,它在 GetInterface 方法上失败。我收到一个异常,说它无法将 Object 转换为 IDevice。

在客户端,IHomeService 类正确地使用字符串实现 GetString 作为它的返回类型,但 GetInterface 具有对象的返回类型。为什么不是 IDevice?

【问题讨论】:

    标签: c# .net wcf


    【解决方案1】:

    你需要告诉 WCF 序列化器使用哪个类来序列化接口

    [ServiceKnownType(typeof(ConcreteDeviceType)]
    

    【讨论】:

    • 很抱歉,我想我不明白。假设我希望 GetInterface 方法返回两个不同的类,SimpleDevice 和 AdvancedDevice,它们都实现了 IDevice 接口。然后我应该为这两种类型设置 ServiceKnownType 吗?
    • 反序列化时,WCF如何知道IHomeService使用什么实现类型?
    • 是的,我想你明白了。您正在告诉 WCF 实现该接口的可能类型。你可以传递任何类型,只要 WCF 知道这些已知类型实现了接口,并且是可序列化的。
    【解决方案2】:

    谢谢,当我这样更改时它可以工作:

    [ServiceContract]
    [ServiceKnownType(typeof(PhotoCamera))]
    [ServiceKnownType(typeof(TemperatureSensor))]
    [ServiceKnownType(typeof(DeviceBase))]
    public interface IHomeService
    {
        [OperationContract]
        IDevice GetInterface();
    }
    

    我也从这个网站得到了帮助:http://www.thoughtshapes.com/WCF/UsingInterfacesAsParameters.htm

    【讨论】:

    • 链接现在是 404,但是一些搜索引擎已经缓存了它
    • Frode:你不认为@Brian 真的回答了你的问题吗?
    【解决方案3】:

    我最初尝试将接口传递给 WCF 方法,但无法使用此线程上提供的答案使代码正常工作。最后我重构了我的代码并将一个抽象类传递给方法而不是接口。我通过使用基类上的 KnownType 属性来实现这一点,例如

    [DataContract]
    [KnownType(typeof(LoadTypeData))]
    [KnownType(typeof(PlanReviewStatusData))]
    public abstract class RefEntityData : EntityData, IRefEntityData
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-30
      • 1970-01-01
      • 2010-12-01
      相关资源
      最近更新 更多