2015-01-12 2 views
1

При кодировании службы SOAP на C#, запуске ее и извлечении WSDL из службы с помощью опции singlewsdl, сгенерированный WSDL имеет пустой атрибут пространства имен в элементе, нарушая соответствие WSI (проверяется с помощью SoapUI) и в результате появляется код ошибки BP2019, указывающий на незаконное пространство имен в ошибке мыла.WCF SOAP service, single wsdl, пустое пространство имен в мыле: ошибка, не совместимая с WS-I, BP2019

Метод обслуживания находится в базовом интерфейсе, из которого услуги получают свои собственные интерфейсы.

Определения в интерфейсе сервиса:

[OperationContract( 
    Action = "http://mynamespace.com/services/2014/06/23/MyBaseContract/GetInterfaceVersionRequest", 
    ReplyAction = "http://mynamespace.com/services/2014/06/23/MyBaseContract/GetInterfaceVersionResponse")] 
[FaultContract(typeof(string), Name="NonsenseFault")] 
string GetInterfaceVersion(); 

WSDL, порожденная службой с singlewsdl содержит пустой атрибут пространства имен:

<wsdl:operation name="GetInterfaceVersion"> 
    <soap:operation soapAction="http://mynamespace.com/services/2014/06/23/MyBaseContract/GetInterfaceVersionRequest" style="document"/> 
    <wsdl:input> 
     <soap:body use="literal"/> 
    </wsdl:input> 
    <wsdl:output> 
     <soap:body use="literal"/> 
    </wsdl:output> 
    <wsdl:fault name="NonsenseFault"> 
     <soap:fault use="literal" name="NonsenseFault" namespace=""/> <!-- spoils WS-I compliance! --> 
    </wsdl:fault> 
</wsdl:operation> 

Согласно правилам WS-I, мыло: элемент ошибки не должен иметь атрибут пространства имен вообще.

Могу ли я что-нибудь предпринять?

+0

делают ли то же самое с '? Wsdl'? –

+0

Нет, это не с? Wsdl, но я хочу, чтобы singlewsdl имел только один файл и не путался с различными xsds. Кстати, когда я создаю проект в SoapUI только с помощью wsdl, он не вызывает вызовы методов. –

+0

Что-то странное происходит там. Вы должны попытаться воспроизвести проблему с более простым случаем. В частности, мне интересно, делает ли это это для всех контрактов на разлом. Меня беспокоит разница между '? Wsdl' и'? SingleWsdl'. –

ответ

0

Возможно, вам удастся решить проблему, установив атрибут Namespace.

[FaultContract(typeof(string), Name="NonsenseFault", Namespace="http://my.nonsense.fault")] 

http://msdn.microsoft.com/en-us/library/system.servicemodel.faultcontractattribute(v=vs.110).aspx

+0

Предполагается, что не имеет пространства имен, по спецификации WS-I. И когда я укажу пространство имен, атрибут пространства имен в soap: fault все еще пуст. –

+0

Возможно, вы сможете сохранить сгенерированный wsdl, настроить пространство имен, импортировать в тестовый проект, используя подход «первый контракт», а затем посмотреть разницу между исходным кодом и автогенерированным кодом. – Seymour

+0

Я хотел использовать подход, основанный на кодах, с определениями сервисов только через интерфейс и атрибуты, без редактирования WSDL, а затем создания контракта из него. На самом деле легко вручную удалить пустой атрибут Namespace и получить WSDL, совместимый с WS-I, но это не то, что я хотел. –