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

问题描述 投票:1回答:2

我有一个实现两个合同的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,我可以使用仅定义IServiceA方法的wsdl和IServiceB相同的方法。

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

先感谢您。

c# .net wcf wsdl
2个回答
1
投票

虽然在OOP中从多个接口派生是有用的,但对于WCF,它会带来可疑的好处。通过滚动到一个,你强制所有人共享相同的实例上下文;并发性;可能还有安全模型。

我会敦促你把服务分开。

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

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

告诉我更多

enter image description here


-1
投票

我最终使用Singleton模式并实现以便于实现一个服务的实现,并且在某种程度上将客户关注点分离。

编辑:

public class ServiceA : IServiceA {

    public void OperationA() {
        Service.Instance.Operation()
    }

}

ServiceB一样。一旦我这样做,我改变了我的.svc文件,仅为Contract实现而不是主服务生成WSDL。

编辑2:

虽然我确实找到了解决问题的方法,但这不是最佳做法。一个更好的方法是@MickyD从一开始就用SOA和SOLID原则解决的设计服务,这将使您的服务更易于维护和销售。

© www.soinside.com 2019 - 2024. All rights reserved.