когда метод WCF возвращает XmlElement , клиент видит возвращенный XElement?

я возвращаю xmlElement из метода WCf. когда я делаю ссылку на службу в клиенте, тот же метод возвращает XElement вместо XmlElement. Я пробовал все: обновлял ссылку на сервис, делал новую ссылку на сервис, но это не помогает.

Это мой клиент:

ServiceReference1.BasicServiceClient basicWCfClient = new ServiceReference1.BasicServiceClient();
        XmlElement xmlelement =  basicWCfClient.GetData(5); 
        basicWCfClient.Close();

я получаю сообщение об ошибке: "Не удается неявно преобразовать тип "System.Xml.Linq.XElement" в "System.Xml.XmlElement""

когда метод на стороне сервера:

 public XmlElement GetData(int value)
    {
        XmlDocument xmldoc = new XmlDocument();
        xmldoc.LoadXml("<msg><node1>Hello</node1><node2>World</node2><request_params><mynode>More</mynode></request_params></msg>");
        XmlElement xmlElement = xmldoc.DocumentElement;
        return xmlElement;
     }

и интерфейс:

    [ServiceContract]
public interface IBasicService
{

    [OperationContract]       
    [WebGet(UriTemplate = "GetData?value={value}")] // Add support for HTTP GET Requests
    XmlElement GetData(int value);}

что здесь происходит ?


person Rodniko    schedule 18.09.2010    source источник


Ответы (2)


Все в порядке. Клиент не знает, какой тип .NET был использован, и ссылка на службу информирует его только о том, что может быть возвращен любой XML. Он принимает XML и предоставляет его как XElement. Это встроенное поведение, и я думаю, что MS выбрала его из-за более нового и удобного API. Зачем нужен метод для возврата XmlElement?

person Ladislav Mrnka    schedule 18.09.2010
comment
мой тестовый клиент действительно скомпилирован в Framework 3.5, но у другой компании (настоящего клиента) не будет Framework 3.5, он работает с framework 2.0 и не распознает XElement, потому что XElement — это Framework 3.5. но, если подумать, вернет ли моя служба WCF XmlElement, когда настоящий клиент (со средой framework 2.0) создаст ссылку на службу? он не вернет Xelement, верно? - person Rodniko; 18.09.2010
comment
только что попробовал ту же ссылку из VS2005 в среде 2.0, и она действительно возвращает Xmlelement. Среда фреймворка была проблемой, спасибо! - person Rodniko; 18.09.2010
comment
Прежде всего, когда вы используете службу в .NET 2.0, вы не сможете использовать ссылку Добавить службу, потому что .NET 2.0 не поддерживает WCF. Вам нужно будет использовать Добавить веб-ссылку, и она будет использовать только типы .NET 2.0. - person Ladislav Mrnka; 18.09.2010
comment
Он может использовать в основном 2.0 с некоторыми библиотеками 3.0 (была версия 3.0), которая в основном является WCF. Я видел это раньше, поэтому, когда он говорит 2.0, он имеет в виду 3.0, то есть 2.0 + WCF (и, возможно, что-то еще, но я не уверен, что там еще было). - person Kevin Anderson; 18.09.2010

Перейдите к Configure Service Reference и проверьте Reuse types in referenced assemblies

Затем отметьте System.Xml, если хотите XmlElement, или System.Xml.Linq, если хотите XElement.

См. также этот вопрос

person Simon_Weaver    schedule 09.09.2012
comment
У меня не работает. Я попытался удалить ссылку на службу и создать ее снова. Я также попытался удалить ссылку на System.Xml и оставить только System.Xml.Linq. Однако он по-прежнему использует XmlNode. - person Der_Meister; 18.06.2014
comment
Вы сняли флажок с system.xml или просто удалили ссылку из проекта? - person Simon_Weaver; 18.06.2014
comment
Пробовал оба способа. Я предполагаю, что WCF пытается использовать XElement не для всех сервисов. Один сервис имеет привязки soap, soap12 и http — используется System.Xml. У другого есть мыло и мыло12 — System.Xml.Linq. - person Der_Meister; 18.06.2014
comment
Кстати, это работает и в другом направлении — я могу использовать System.Xml для обеих служб. Итак, ваш ответ помог мне. Спасибо. - person Der_Meister; 18.06.2014