Web服务是否应通过将?wsdl
附加到端点地址来提供WSDL的任何标准强制要求?
如果WSDL托管在不同的URL(没有附加?wsdl
),是否可以?
例如:
Endpoint: http://abc.xyz.com/MyService
WSDL: http://abc.xyz.com/MyServiceDefinition.pqr
请注意,我甚至为WSDL定义使用了不同的扩展名。
使用这种方法是否违反任何标准,或者可以按照他们想要的方式托管事物?
答案 0 :(得分:2)
是否必须使用
访问WSDL定义?wsdl
?
不,不是。
WSDL用于描述Web服务契约,因为它允许工具自动生成客户端存根代码以调用指定的Web服务。将WSDL暴露在与附加?wsdl
的Web服务相同的位置,这非常方便,这是每个人都使用的约定。
人员和工具在该位置查找WSDL,框架会自动在该位置公开它,但它只是一个约定。据我所知,这并没有在任何规范中指明(或者至少我没有找到)。
有时虽然您不想提供每个人都可以查看并尝试创建客户端的WSDL,因为它是一个私有Web服务,您只想访问您的合作伙伴,而不是每个人。此时,您可以禁用?wsdl
URL,并通过使用备用渠道仅向您的合作伙伴提供WSDL。如果您不希望它在线公开,您甚至可以通过电子邮件发送它。
所以你可以选择任何渠道来揭露它。请记住,因为人们和工具遵循这个惯例,他们习惯于在那里看到它,而一些(写得不好)的工具可能会在不同的扩展中窒息。
P.S。我想提到的另一件事 - 与这个答案没有严格关系,但有点强化了惯例 - 是the new ?singleWsdl
option in WCF 4.5。
与大多数其他工具一样,WCF在?wsdl
地址公开WSDL,但使用带外部模式的xsd:import语句。有些框架无法使用导入的依赖项处理WSDL,因此人们开始在WCF上编写自定义项以暴露平面WSDL,以至于在最新版本的WCF中Microsoft决定立即添加此功能。
但是为了向后兼容,他们需要保持?wsdl
端点不变(返回带有xsd:import语句的WSDL文档),并被迫为平面WSDL添加新的查询参数:{{1 }}。我相信其他网络服务供应商和提供商也会接受这个想法。
答案 1 :(得分:1)
不,它不是强制要求?wsdl访问,但它的推荐方式。 值得注意的是,大多数客户端会尝试将“?wsdl”附加到您的URL并尝试访问WSDL文件,因此强烈建议您进行设置。