【问题标题】:Can I inherit my WCF DataContract from a shared interface?我可以从共享接口继承我的 WCF DataContract 吗?
【发布时间】:2012-07-09 19:20:33
【问题描述】:

我在同一个解决方案(不同的项目)中有 WCF 服务和客户端。服务类本身继承自一个接口,并且该接口在客户端和服务器之间共享(通过链接文件)。客户端使用服务工厂来生成代理。事实证明,这是一种非常好的方法,可以在不从客户端引用服务器端项目的情况下链接两端。

其中一个服务方法返回一个包含 DataContract 和 DataMember 属性的对象,直到最近这个 还链接到客户端,但是服务器端逻辑被排除在客户端之外使用编译符号。

我决定把它也变成一个界面会更明智。但是现在每次从客户端调用服务方法时都会出现以下异常:

底层连接已关闭:预期保持活动状态的连接已被服务器关闭。

其内部异常如下:

无法从传输连接读取数据:现有连接被远程主机强行关闭。

因此,通过简化示例,我的服务本质上与客户端共享以下接口:

public interface IMyData
{
    [DataMember]
    int Id {get; set;}

    [DataMember]
    string Description {get; set;}
}

接口使用并返回的实际对象如下所示:

[DataContract]
public class MyData : IMyData
{
    [DataMember]
    public int Id {get; set;}

    [DataMember]
    public string Description {get; set;}
}

我的服务界面是这样的:

[ServiceContract]
public interface IMyService
{
    [OperationContract]
    IMyData GetData();
}

实现看起来像这样:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.Single)]
public class MyService : IMyService
{
    [OperationContract]
    IMyData GetData()
    {
        // Get data.
    }
}

希望这一切都有意义!我只是想知道我是否做错了。如果必须的话,我将返回共享课程并切掉仅服务器端的代码......但如果可以的话,我宁愿使用接口。

有什么想法吗?

【问题讨论】:

  • 好吧,AFAIK WCF 需要知道所有可能的对象以通过网络传输(因此也有 KnownTypes 混杂),因此不可能在服务方法中返回接口。例如,最好的办法是返回一个受限于接口的具体类型。
  • 谢谢艾伦 - 这很有道理。

标签: c# wcf service interface datacontract


【解决方案1】:

将接口放在DataContract 上没有任何好处,因为它们只表示数据而没有逻辑。您通常将这些 DataContracts 与 ServiceContracts 放在同一个程序集中,或者放在一个单独的程序集中。这将防止将业务逻辑暴露给您的客户。

【讨论】:

  • 所以您认为我应该将其保留为标准类,但将所有逻辑提取到构建和返回它的服务中,将 DataContract 保留为一组属性?
  • 是的。您将ServiceContract 公开为接口,将DataContract 公开为类。它们内部都没有业务登录,因此可以安全地分成一个程序集并共享。只有您在服务器端的服务实现具有 BL
  • 谢谢 - 我会试一试并报告!
  • 感谢您的提示,aqwert - 我现在有几个工厂类生成数据协定类所需的内容,实际上它比我尝试沿接口路线走之前要整洁得多!
猜你喜欢
  • 1970-01-01
  • 2014-11-09
  • 1970-01-01
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
  • 2023-03-28
相关资源
最近更新 更多