为单个服务实现的合同(每个合同)生成单独的WSDL

时间:2019-03-27 16:17:36

标签: c# .net wcf wsdl

我有一个实现两个合同的Web服务:

[ServiceContract]
public interface IServiceA
{
    [OperationContrcat]
    void OpertationA();
}

[ServiceContract]
public interface IServiceB
{
    [OperationContrcat]
    void OpertationB();
}

public class Service : IServiceA, IServiceB
{
 …
}

在我的 web.config 中,我为每个合同定义了单独的端点的服务,这很正常,但是我也希望能够分别为每个合同导出WSDL。

目前,我只获得整个服务的单个WSDL,使用该服务时,它会生成一个客户端,该客户端可以查看IServiceAIServiceB中的两种方法。

我想知道是否有一种方法可以提供一个单独的wsdl,如果我需要ServiceAClinet,我可以使用wsdl,该wsdl仅定义IServiceA中的方法,而{{1 }}。

经过一番搜索,我发现这个Single endpoint with multiple service contracts实际上是一个好主意,不需要太多额外的工作,但是我想知道是否可以不用包装器来做到这一点?

谢谢。

2 个答案:

答案 0 :(得分:1)

尽管在OOP中,从多个接口派生非常有用,但是对于WCF,它带来的好处令人怀疑。通过合二为一,您可以强制所有人共享同一实例上下文。并发以及可能的安全模型。

我敦促您将服务分开。

  • 单独的服务实施项目(仅针对您的情况,因为您需要单独的WSDL,通常,将服务实施放入单个项目中是最佳做法)
  • 理想情况下,
  • WCF服务方法应该仅仅是对与另一个与WCF / REST / etc没有关系的项目中定义的实际服务逻辑的薄包装。让包装程序将调用委托给实现

如果您遵循此建议,那么如何获得单独的WSDL的问题就会消失。

告诉我更多

enter image description here

答案 1 :(得分:-1)

我最终使用Singleton模式进行了实现,并获得了实现一项服务的便利性,并在某种程度上分离了客户方面的问题。

编辑:

55

,与public class ServiceA : IServiceA { public void OperationA() { Service.Instance.Operation() } } 相同。完成该操作后,我将.svc文件更改为仅为Contract实现而不是主服务生成WSDL。

编辑2:

虽然我确实找到了解决问题的方法,但这并不是最佳实践。 @MickyD会回答一种更好的方法,即从一开始就使用SOA和SOLID原理设计服务,这将使您的服务更加可维护和可销售。