甚至可以创建仅限接口的WCF服务吗?我的理由是,每次客户端提出新的具体实现时,我都不希望服务器必须使用新的DataContracts DLL和/或KnownTypes进行更新 - 有没有办法实现这个,或者甚至可以用WCF吗?
示例接口(存在于客户端和服务器上):
[ServiceContract]
public interface IProcessingService
{
[OperationContract]
IResponse Process(IRequest request);
}
public interface IRequest { ... }
public interface IResponse { ... }
服务器端不存在IRequest的实现,而IProcessingService / IResponse只能在服务器端实现。
示例DataContract实现(仅存在于客户端):
[DataContract]
internal class ProcessingTypeARequest : IRequest { ... }
[DataContract]
internal class ProcessingTypeBRequest : IRequest { ... }
我的目标是只在客户端上存在 IRequest的具体实现,所以我希望客户端和服务器只使用接口进行通信。这甚至可能吗?
我怀疑这是不可能的,因为System.ServiceModel.CommunicationException总是在运行时发生,并带有类似于此的错误消息:
尝试序列化参数请求时出错 InnerExceptionMessage是'带有数据的Processing ProcessingTypeARequest 合同名称ProcessingTypeARequest不是预期的。考虑使用 DataContractResolver或将任何静态未知的类型添加到列表中 已知类型 - 例如,通过使用KnownTypeAttribute 属性或将它们添加到传递给的已知类型列表中 DataContractSerializer的。
答案 0 :(得分:1)
据我所知,不可能以您描述的方式拥有“仅限接口”的WCF服务。
典型的WCF模式是“IRequest的具体实现”只不过是数据容器,几乎没有方法或业务逻辑。 [DataContract]
对象的目的只是包含一个属性列表,表示发送到WCF调用或从WCF调用返回的数据。
当客户端将数据传输到(具体)[DataContract]
对象进行调用时,WCF客户端会提供自己的方法或类来处理数据,直到进行调用。然后客户端获取返回的对象并将数据传回到它想要用来处理数据的任何类中。
以下是一个示例:
[ServiceContract]
public interface IProcessingService
{
[OperationContract]
ProcessingResponse Process(ProcessingRequest request);
}
[DataContract]
public class ProcessingResponse
{
public bool Success { get; set; }
public string Result { get; set; }
}
[DataContract]
public class ProcessingRequest
{
public int ProcessNumber { get; set; }
public string ProcessInput { get; set; }
}
[ServiceContract]
是interface
,其中实现仅在服务器端定义。 [DataContract]
成员只是方法调用所需参数的定义。因此,在此示例中,将服务方法定义为
[OperationContract]
ProcessingResponse Process(ProcessingRequest request);
在语义上等同于将其定义为
[OperationContract]
ProcessingResponse Process(int processNumber, string processInput);
更改[DataContract]
在语义上等同于更改方法上的签名,因此[DataContract]
只应在需要更改IProcessingRequest
的相同情况下进行更改。