2010-05-18 3 views
8

Я создал службу WCF с одного метода, который возвращает System.Xml.XmlElement:VS2010 смешивает System.Xml.XmlElement с System.Xml.Linq.XElement?

Интерфейс:

[ServiceContract] 
public interface IWCFService 
{ 
    [OperationContract] 
    XmlElement Execute(...); 
} 

Услуги:

public XmlElement Execute(...) 
{ 
    XmlNode node = ...; 

    return (XmlElement)node; 
} 

При попытке получить доступ к службе развертывания на моем сервере

WCFServiceClient service = new WCFServiceClient("WSHttpBinding_IWCFService"); 
XmlElement node = service.Execute(...); 

я получаю ошибку:

Cannot implicitly convert type 'System.Xml.Linq.XElement' to 'System.Xml.XmlElement'

Поиск мое решение службы, я не могу видеть любые ссылки на System.Xml.Linq.XElement. Неправильно ли я ожидать, что System.Xml.XmlElement или VS 2010 обманывает меня?

+0

Попробуйте вызвать службу с помощью wcftestclient.exe. Вы получаете какие-либо ошибки? –

+0

@Raj: Это невозможно, так как 'wcftestclient' не поддерживает' System.Xml.XmlElement'. Но достаточно смешно ничего не говорится о 'System.Xml.Linq.XmlElement'. – Chau

+0

Узнайте, помогает ли этот пост: http://social.msdn.microsoft.com/Форумы/en-US/wcf/thread/2f29bdab-a3ab-41b9-980a-692e7bb7e133 –

ответ

-1

Я ненавижу, чтобы ответить на мой собственный вопрос, но здесь идет:

Насколько я могу видеть, System.Xml.XmlElement МОЖЕТ быть использован в качестве типа возвращаемого значения для службы WCF. Значение DataContractSerializer, используемое по умолчанию в WCF, составляет support этого типа, и поэтому не следует использовать XmlSerializer.

Однако моя проблема не имеет ничего общего с сериализацией, но благодаря Raj Kaimal за предоставленную возможность.

Я следил за WCF tutorials, предоставленным Microsoft, в котором говорится, что вы должны добавить службу WCF в качестве справочника службы , если вы хотите использовать эту услугу. Это похоже на VS2008, но при переключении на VS2010 этот подход changes the return type от System.Xml.XmlElement к (новее?) System.Xml.Linq.XElement. Чтобы решить эту проблему, вам необходимо добавить эту услугу в качестве справочника вместо.

+0

Это неточный ответ. Ссылка на службу была сгенерирована путем загрузки XML-схемы, которая находится в WSDL. По-видимому, ваша схема имеет несколько мест, где она принимает произвольный XML. Когда клиент использует такую ​​услугу, клиент, скорее всего, выберет что-то вроде XmlElement или XElement в качестве типа возврата. –

+0

@John: Ответ такой же точный, как я могу это сделать - по крайней мере в настоящее время. Я все еще в самом начале использования WCF (и XML), и мой ответ, похоже, работает на меня. Я не знаю, как это сделать, - и я знаю, и любые изменения более чем приветствуются. Спасибо за внимание и комментарий :) – Chau

+0

вот эксперимент: создайте класс контрактных данных. Добавьте к нему метод. Верните его из сервисной операции. Используйте его на клиенте. Посмотрите, существует ли метод на клиенте. Если вы не используете функцию «share types», метода не будет - только то, что может быть передано WSDL. –

4

1) Удалите ссылку System.Xml.Linq от вашего клиента 2) Обновите службы ссылки 3) Повторно сгенерированный Reference.cs файл будет ссылаться XmlElement вместо XElement

20

То, что я нашел работает лучше всего и проще всего для этого - щелкнуть правой кнопкой мыши ссылку на службу, а затем нажать «Настроить сервисную ссылку». Как только в диалоговом окне для этого внизу вы увидите 2 переключателя, которые говорят «Типы повторного использования в все ссылочные сборки» или «Типы повторного использования в , указанные ссылочные сборки». Нажмите на второй вариант для «определенных сборок». После этого будет активирован список, и вы сможете проверить все сборки и оставить System.Xml.Linqнепроверено. Таким образом, каждый раз, когда вы обновляете ссылку на службу, вы получите ожидаемые результаты, и это будет храниться в конфигурации клиента.

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