В проекте ac # мне приходится запрашивать некоторые веб-сервисы, которые не созданы с помощью .Net (на самом деле WebLogic).
Где я могу без проблем запрашивать большинство веб-сервисов, у меня возникают проблемы содин.Когда я вызываю метод, я получаю следующую ошибку (трассировка стека удалена):
System.InvalidOperationException: There was an error reflecting 'in'.
---> System.InvalidOperationException: The top XML element 'in' from namespace '' references distinct types MyReference.DistantWS.firstMethodInType and MyReference.DistantWS.secondMethodInType.
Use XML attributes to specify another XML name or namespace for the element or types.
После небольшого поиска в Google я пришел к выводу, что это связано с тем, что в удаленном сервисе есть два метода FirstMethod
и * 1007.*, оба с комплексным типом FirstMethodRequest
, имеющим свойство «In» в качестве входного параметра.Однако параметр In имеет два различных типа (соответственно firstMethodInType
и secondMethodInType
).
Я использую svcutil
для построения прокси-кода.Это фактически генерирует код:
Псевдокод:
class firstMethodRequest
{
public firstMethodintype @in; // First occurence of a "in" parameter
}
class firstMethodintype
{
}
class secondMethodRequest
{
public secondMethodintype @in; // Second occurence of a "in" parameter
}
class secondMethodintype
{
}
Полный код:
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.MessageContractAttribute(WrapperName="first-method", WrapperNamespace="http://mynamespace/ws/wsdl/first-method", IsWrapped=true)]
internal partial class firstMethodRequest
{
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="", Order=0)]
public firstMethodintype @in;
public firstMethodRequest() { }
public firstMethodRequest(firstMethodintype @in) { this.@in = @in; }
}
[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(TypeName="first-method-in-type", Namespace="http://mynamespace")]
public partial class firstMethodintype
{
private string site_origineField;
}
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.MessageContractAttribute(WrapperName="second-method", WrapperNamespace="http://mynamespace/ws/wsdl/second-method", IsWrapped=true)]
internal partial class secondMethodRequest
{
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="", Order=0)]
public secondMethodintype @in; // Problem is here
public secondMethodRequest() { }
public secondMethodRequest(secondMethodintype @in) { this.@in = @in; }
}
[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(TypeName="second-method-in-type", Namespace="http://mynamespace")]
public partial class secondMethodintype
{
private string site_origineField;
}
Поскольку я не контролирую выходной код, как я могу правильнорешить мою проблему?
спасибо заранее
[Редактировать] Не знаю, связано ли это, но вот выдержка из определения WSDL:
<message name="first-method-in">
<part name="in" type="tp:first-method-in-type"/>
</message>
<message name="second-method-in">
<part name="in" type="tp:second-method-in-type"/>
</message>
[Редактировать 2] Кроме того, если исходный WSDL / схема не является действительным или не соответствует стандартам W3C, пожалуйста, сообщите мне.Я могу договориться с клиентом переписать его WS
[Edit 3] Если я вручную исправлю wsdl в (переименовав вторую часть):
<message name="first-method-in">
<part name="in" type="tp:first-method-in-type"/>
</message>
<message name="second-method-in">
<part name="inSecond" type="tp:second-method-in-type"/>
</message>
затемпроблема исчезла (но перестал работать вызов второго метода)