微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WCF Soap WSDL 未加载所有类型

如何解决WCF Soap WSDL 未加载所有类型

我们有一个 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。看起来现在缺少一大堆类型定义。

我尝试查看是否在 svc.?singleWsdl 加载上执行了 KNownTypesHelper,但我从未得到断点。我不知道下一步该往哪里看。缺少哪些类和存在哪些类似乎没有韵律或理由。我已尝试尽可能多地分享这方面的内容,但项目和依赖关系的影响相当深远。

解决方法

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。