我在同一解决方案中有一个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.
}
}
希望一切都有点意义!我只是想知道我这样做是不是错了。如果必须的话,我将回到共享类并分割出仅限服务器端的代码..但如果可以,我宁愿使用接口。
有什么想法吗?
答案 0 :(得分:3)
将接口放在DataContract
上没有任何好处,因为它们只是表示数据而不是逻辑。您通常将这些DataContracts与ServiceContracts
或单独的程序集放在同一个程序集中。这样可以防止将业务逻辑暴露给您的客户。