0

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

[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 负载上执行,但我从未得到断点。我不知道下一步该往哪里看。缺少哪些类和存在哪些类似乎没有押韵或原因。我试图尽可能多地分享这个,但项目和依赖关系相当深远。

4

1 回答 1

0

我的问题似乎是调用 .svc?singleWsdl(或 ?wsdl)实际上并没有加载服务类,只有合同。由于我的 KnownType 加载是在服务类上完成的,因此合约无法使用该元数据来知道它需要它们。

解决方案是将 ServiceKnownType 属性移动到允许合约加载缺失类型的接口。

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

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

于 2021-04-11T02:44:07.353 回答