WCF Soap WSDL 未加载所有类型

WCF Soap WSDL not loading all types

我们有一个 WCF SOAP 服务,它构建了一个大约 430kb 的 WSDL。直到最近,服务合同还是服务 class

[ServiceContract]
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
[ServiceKnownType("GetKnownTypes", typeof(KnownTypesHelper))]
public class FunctionalityProviderService : IServiceBehavior
{
    ...
}

但我们想扩展服务以拥有一些 GET 端点来测试服务健康状况。为此,我提取了一个接口,如下所示:

[ServiceContract(Name = "FunctionalityProviderService"]
public class IFunctionalityProviderService
{
    ...
}

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
[ServiceKnownType("GetKnownTypes", typeof(KnownTypesHelper))]
public class FunctionalityProviderService : IServiceBehavior, IFunctionalityProviderService
{
    ...
}

并更新了 web.config 以匹配。

<service behaviorConfiguration="CustomServiceBehavior" name="MyProject.FunctionalityProviderService">
  <endpoint address="" binding="customBinding" contract="MyProject.IFunctionalityProviderService" bindingConfiguration="BinaryHttpBinding" />
  <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>

此服务是通过 .svc 文件托管的 IIS,因此无需对其进行任何更改。

执行此操作并导航到 /FunctionalityProviderService.svc?singleWsdl 后,wsdl 的大小下降到 230kb。看起来现在缺少一大堆类型定义。

我尝试查看 KnownTypesHelper 是否正在 svc.?singleWsdl 加载上执行,但我从未遇到断点。我不知道下一步该去哪里。似乎没有 classes 缺失和存在的押韵或原因。我已尝试尽可能多地分享这方面的内容,但项目和依赖关系相当深远。

我的问题似乎是调用 .svc?singleWsdl(或 ?wsdl)实际上并未加载服务 class,仅加载合同。由于我的 KnownType 加载是在服务 class 上完成的,因此合同无法使用那部分元数据来了解它需要它们。

解决方案是将 ServiceKnownType 属性移至接口,以允许合同加载缺少的类型。

[ServiceContract(Name = "FunctionalityProviderService"]
[ServiceKnownType("GetKnownTypes", typeof(KnownTypesHelper))]
public class IFunctionalityProviderService
{
    ...
}

移动属性后,我的 wsdl 文件大小向另一个方向移动了 200kb...现在我太大了。但我想我知道为什么。