2010-04-30 2 views
1

У меня есть веб-сервис, который возвращает простой объект:декларации Удаление пространства имен из ответа веб-службы

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.4927")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.SoapTypeAttribute(Namespace="urn:CHAMADO")] 
public partial class STRUCCHAMADOOUT : object, System.ComponentModel.INotifyPropertyChanged { 

    private string cODField; 

    private string mSGField; 

    /// <remarks/> 
    public string COD { 
     get { 
      return this.cODField; 
     } 
     set { 
      this.cODField = value; 
      this.RaisePropertyChanged("COD"); 
     } 
    } 

    /// <remarks/> 
    public string MSG { 
     get { 
      return this.mSGField; 
     } 
     set { 
      this.mSGField = value; 
      this.RaisePropertyChanged("MSG"); 
     } 
    } 

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; 

    protected void RaisePropertyChanged(string propertyName) { 
     System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged; 
     if ((propertyChanged != null)) { 
      propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

этот класс был создан с помощью wsdl.exe, на основе файла WSDL, предоставленной клиентом. Это веб-метод:

[WebMethod(MessageName="CHAMADORequest")] 
[SoapRpcMethod(
Action = "urn:CHAMADO#CHAMADO", 
RequestNamespace = "urn:CHAMADO", 
RequestElementName = "CHAMADO", 
ResponseNamespace = "", 
ResponseElementName = "return", 
Use = SoapBindingUse.Literal 
)] 
[return: XmlElement("return")] 
public STRUCCHAMADOOUT CHAMADO(STRUCCHAMADOIN ENTRADA) 
{ 
    STRUCCHAMADOOUT result = new STRUCCHAMADOOUT(); 
    try { 
     string str = Util.GetRequestXML(); 
     persist(getResult<Entidades.Chamado>(str, "ENTRADA", string.Empty)); 

     result.COD = "1"; 
     result.MSG = "Operação realizada com sucesso"; 
    } catch (Exception ex) { 
     result.COD = "0"; 
     result.MSG = ex.Message + Environment.NewLine + ex.StackTrace; 
    } 

    return result; 
} 

Клиент говорит, что его система поднимает ошибку, потому что ответ сервис имеет пространства имен декларации, так же, как это:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
<CHAMADOResponse xmlns="urn:CHAMADO" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <return xmlns=""> 
     <COD xmlns="urn:CHAMADO">1</COD> 
     <MSG xmlns="urn:CHAMADO">Operação realizada com sucesso</MSG> 
    </return> 
</CHAMADOResponse> 

Теперь, мне удалось удалить пространства имен от COD и MSG, применив attuteute WebServiceBinding(ConformsTo = WsiProfiles.None) к классу службы и установив ResponseNamespace в пустую строку. Но CHAMADOResponse все еще имеют декларацию пространств имен. Я почти уверен, что так не должно быть. На самом деле, я не считаю, что пространство имен является проблемой вообще. С самого начала этот проект был трудным, так как нам приходилось создавать службы, которые соответствовали бы устаревшему wsdl.

Мой вопрос: есть ли способ удалить все объявления с именами из ответа веб-службы?

Редактировать

Я вошел ответ сервера и получил это:

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
     <CHAMADOResponse> 
      <return> 
       <COD>1</COD> 
       <MSG>Operação realizada com sucesso</MSG> 
      </return> 
     </CHAMADOResponse> 
    </soap:Body> 
</soap:Envelope> 

Там нет объявления пространства имен в теле сообщения. Но клиент говорит, что он получил это:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
<!-- Request Message Mapping --> 
<CHAMADOResponse xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'> 
    <return> 
     <COD>1</COD> 
     <MSG>Operação realizada com sucesso</MSG> 
    </return> 
</CHAMADOResponse> 

Я что-то пропустил?

+1

Если класс был создан на основе WSDL, предоставленного клиентом, этот клиент должен лучше узнать, как использовать и обрабатывать пространства имен XML –

ответ

0

Фернандо,

я столкнулся с подобным situtation с одним наших унаследованными системами (UNIVERSE), в которых она не имеет истинный синтаксический анализатор XML, но доморощенные системы, которая работает с помощью сырого соответствия строки. Решение, которое мы нашли работать, заключается в том, чтобы реализовать IXmlSerializable в классах, которые будут переданы в систему, а при записи в XmlWriter мы можем контролировать, какие пространства имен будут добавлены. Ниже приведен пример одной из этих реализаций.

/// <summary> 
/// Serialize the state to XML 
/// </summary> 
/// <param name="writer">The writer to write the state</param> 
public void WriteXml(XmlWriter writer) 
{ 
    writer.WriteElementString("TERMINATION_STATUS", Status); 
    writer.WriteElementString("TRANS_SEQ_NUM", Sequence.ToString()); 
    writer.WriteElementString("INTRN_SEQ_NUM", Id.ToString()); 
    writer.WriteElementString("CMRCL_FLAG", IsCommercialCard.ToString()); 
    writer.WriteElementString("AUTH_CODE", Authorization); 
    writer.WriteElementString("CMRCL_TYPE", CommericalFlag.ToString()); 
    writer.WriteElementString("RESULT_CODE", ResultCode.ToString()); 
    writer.WriteElementString("TROUTD", RoutingId.ToString()); 
    writer.WriteElementString("RESPONSE_TEXT", Message); 
    writer.WriteElementString("REFERENCE", ProcessorReferenceCode); 
    writer.WriteElementString("PAYMENT_MEDIA", PaymentMedia); 
    writer.WriteElementString("RESULT", Result.ToString().ToUpper()); 
    if (Error != null) 
    { 
     writer.WriteStartElement("ERROR"); 
     writer.WriteElementString("ERROR_CODE", Error.Code); 
     writer.WriteElementString("ERROR_DESCRIPTION", Error.Description); 
     writer.WriteEndElement(); 
    } 
} 

Опять же, поскольку это обычное место, это не помогает, но достаточно легко попробовать.

Смежные вопросы