【问题标题】:Generate seperate WSDL for contracts (per contract) implemented by single service为单个服务实现的合同(每个合同)生成单独的 WSDL
【发布时间】:2019-08-18 07:11:47
【问题描述】:

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

[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,它只定义来自 IServiceA 的方法,对于 IServiceB 也是如此。

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

提前谢谢你。

【问题讨论】:

    标签: c# .net wcf wsdl


    【解决方案1】:

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

    我强烈建议您将服务分开。

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

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

    告诉我更多

    【讨论】:

    • 感谢过去几天我一直在阅读有关 SOA 并偶然发现 arcitura 的书。它将为正确实施新服务派上用场。不幸的是,我目前无法使用它。但是,我会将其标记为答案,因为它是迄今为止更好的解决方案。
    【解决方案2】:

    我最终使用了 Singleton 模式并进行了实现,以方便实现一项服务并在某种程度上分离客户端的关注点。

    编辑:

    public class ServiceA : IServiceA {
    
        public void OperationA() {
            Service.Instance.Operation()
        }
    
    }
    

    ServiceB 也是如此。一旦我这样做了,我就更改了我的 .svc 文件,只为合同实现而不是主要服务生成 WSDL。

    编辑 2:

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

    【讨论】:

    • 您不仅应该发布解决问题的代码,而且我不明白将服务设为单例如何解决问题。 WCF 单例是纯 .NET 内部实现细节,对服务的调用者无关紧要。单例信息won't 也不应该出现在 WSDL 中
    • 另外,如果你真的想遵循 SOLID 和 “关注点分离”,你不会试图将 two services 本质上融合到 one 中。对于 WCF(以及一般的 SOA/微服务最佳实践),您希望避免单体服务,这是您着手解决但没有实现的目标
    • 抱歉,忘记贴代码和解释了。第二次将两个服务“融合”到 on 中并不是 SOLID 所不知道的,例如,您可以有一个实现 IAddToRegestryIGetFromRegestryRegister 类。这将使Register 类更易于使用,同时注册表的用户只会与他需要的内容一致(从注册获取/设置)。
    • 另外使用 SOA 可能会有所帮助,但项目本身需要进行重大重构。虽然我同意这是应该做的事情,但不幸的是它不是。
    猜你喜欢
    • 2018-02-07
    • 2013-07-02
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多