У меня есть служба WCF, которую необходимо предоставить через конечную точку SOAP (wsHttpBinding) и конечную точку REST (webHttpBinding). Я включил Имена и Пространства имен в соответствующие атрибуты, чтобы помочь в управлении версиями (tempuri.org должен быть полностью исключен из WSDL). По какой-то причине, если я не добавляю атрибут bindingNamepace в конечную точку webHttpBinding, он добавляет пространство имен tempuri.org в WSDL. Пример вывода WSDL ниже.
WSDL без привязкиNamespace -
<wsdl:definitions name="State" targetNamespace="http://example.com/services/masterdat/state/2012/02/05"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:tns="http://example.com/services/masterdata/state/2012/02/05"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:i0="http://tempuri.org/"
xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy"
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract"
xmlns:wsa10="http://www.w3.org/2005/08/addressing"
xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex"
xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata">
WSDL с bindingNamespace -
<wsdl:definitions name="State" targetNamespace="http://example.com/services/masterdata/state/2012/02/05"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:tns="http://example.com/services/masterdata/state/2012/02/05"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy"
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract"
xmlns:wsa10="http://www.w3.org/2005/08/addressing"
xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex"
xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata">
Вот мой web.Config для конечных точек. Я использую WCFExtras, чтобы сгладить мои WSDL (отсюда и поведениеConfiguration на конечной точке wsHttpBinding), но без него поведение такое же.
<services>
<service name="MasterDataExample.Services.StateService">
<!-- bindingConfiguration="defaultWsBinding" -->
<endpoint address="soap"
behaviorConfiguration="flatWsdl"
binding="wsHttpBinding"
bindingNamespace="http://example.com/services/masterdata/state/2012/02/05"
contract="MasterDataExample.Services.IStateService"
name="soap" />
<!-- -->
<endpoint address="json"
behaviorConfiguration="json"
binding="webHttpBinding"
bindingNamespace="http://example.com/services/masterdata/state/2012/02/05"
contract="MasterDataExample.Services.IStateService"
name="ajax" />
</service>
</services>
Я загрузил WCFExtras в свое решение и посмотрел WsdlExporter, чтобы посмотреть, смогу ли я найти упоминание о tempuri.org безуспешно. Я также использовал XSharper.Core для вывода графа объекта, чтобы посмотреть, смогу ли я его найти. Его там нет.
Кто-нибудь испытывал это раньше? В качестве обходного пути я включу bindingNamespace в конечную точку webHttpBinding, чтобы поддерживать чистоту WSDL, но я хотел бы знать, почему это происходит.
Спасибо!