c# - 我可以从共享接口(interface)继承我的 WCF DataContract 吗?

标签 c# wcf service interface datacontract

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

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

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

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

其内部异常如下:

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

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

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

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

该接口(interface)使用并将返回的实际对象如下所示:

[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.
    }
}

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

有什么想法吗?

最佳答案

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

关于c# - 我可以从共享接口(interface)继承我的 WCF DataContract 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11401640/

相关文章:

c# - 如何从服务器端代码显示消息框?

从服务调用方法时 WCF 客户端卡住

wcf - 在 XP SP3 上使用 SSL 的自承载 WCF 服务

asp.net - 验证 Web 服务

java - JAR 中的静态变量在进程之间共享?

c# - ForeignKeyConstraint.AcceptRejectRule 在 ADO.Net 中的用途?

c# - 电子邮件正文中未解释 Html IFrame 标记

java - 从另一个 Axis 服务获取已部署的 Axis 服务列表

c# - 类型转换泛型

wcf - HTTP 请求未经客户端身份验证方案 'Basic' 授权。从服务器收到的身份验证 header 是 'Negotiate,NTLM'