Изменение имени результата метода веб-сервиса

#c# #web-services #asmx

#c# #веб-сервисы #asmx

Вопрос:

Вероятно, это простая вещь, но я не нашел рабочего способа сделать это.

У меня есть веб-сервис C #, который в настоящее время имеет вывод, подобный этому:

 <GetInformationResponse>
  <GetInformationResult>
    <Policy>
    </Policy>
  </GetInformationResult>
<GetInformationResponse>
  

Что мне нужно, так это вывод, подобный этому:

 <GetInformationResponse>
  <InformationResponse>
    <Policy>
    </Policy>
  </InformationResponse>
<GetInformationResponse>
  

Я попытался обернуть все в объект «InformationResponse», но у меня все еще есть объект «GetInformationResult», инкапсулирующий его. В принципе, мне нужно переименовать «GetInformationResult» в «InformationResponse».

Спасибо!

ETA: информация об объекте / методе

 [WebMethod]
public InformationResponse GetInformation(GetInformationRequest GetInformationRequest)
{
  InformationResponse infoSummary = new InformationResponse();
  Policy policy = new Policy();
  // setting values

  return infoSummary;
}
  

Объект InformationResponse:

 [System.Xml.Serialization.XmlInclude(typeof(Policy))]
public class InformationResponse : List<Policy>
{
  private Policy policyField;

  /// <remarks/>
  [System.Xml.Serialization.XmlElementAttribute("Policy", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
  public Policy Policy
  {
    get
    {
        return this.policyField;
    }
    set
    {
        this.policyField = value;
    }
  }
}
  

Комментарии:

1. Вы должны указать больше деталей. Является ли это сервисом SOAP? Почему вас волнуют эти внутренние компоненты? …?

2. Веб-сервис генерируется с помощью WSDL или из кода? Можем ли мы увидеть, какой из них определяет это сообщение?

3. Это сервис SOAP, сгенерированный с помощью кода. Лично меня не волнуют внутренние компоненты, но руководство установило схему в stone, и она должна соответствовать приведенному выше.

4. Это служба ASMX или WCF?

Ответ №1:

Обычно использование XmlElementAttribute позволяет переопределить имя сериализованного элемента. Однако в веб-службе ASMX это, похоже, не работает. Однако, используя атрибут в WebMethod, я смог создать поведение, которое вы ищете. Попробуйте это:

 [WebMethod]
[return: System.Xml.Serialization.XmlElementAttribute("InformationResponse")]
public InformationResponse GetInformation(GetInformationRequest GetInformationRequest)
{  
   ....
}
  

Комментарии:

1. Я пробовал это, но результат был таким: <GetInformationResponse> <InformationResponse> </InformationResponse><InformationResponse> </InformationResponse></GetInformationResponse> Если я его инкапсулирую, получается вот так: <GetInformationResponse> <InformationResponse><InformationResponse> </InformationResponse></InformationResponse></GetInformationResponse>

Ответ №2:

Что вам нужно, так это добавить объявление XmlRoot следующим образом:

 [XmlRoot("MyName")]
public class MyName
{}
  

Ответ №3:

Я решил аналогичную проблему, я изменил WSDL и удалил элемент result, затем сгенерировал прокси-класс с wsdl.exe и использовать прокси-класс для моего ASMX