#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