2013-11-20 4 views
12

Я добавляю веб-службы Navision к простому приложению Windows Forms с использованием Add Service Reference в Visual Studio 2010, ссылка генерируется, но внутри кода есть дублированные определения, которые останавливают код из компиляции, например:Добавление ссылки на службу создает дублированные определения для перечислений и методов

Ошибка

Пространство имен 'WindowsFormsApplication1.ServiceReference1' уже содержит определение для 'Статус' C: \ Trash \ WindowsFormsApplication1 \ WindowsFormsApplication1 \ Service Ссылки \ ServiceReference1 \ Reference.cs

и внутри Reference.cs У меня есть

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.1015")] 
[System.SerializableAttribute()] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:microsoft-dynamics-schemas/page/salesheaderpage")] 
public enum Status { 

    /// <remarks/> 
    Open, 

    /// <remarks/> 
    Released, 

    /// <remarks/> 
    Pending_Approval, 

    /// <remarks/> 
    Pending_Prepayment, 
} 

и

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")] 
[System.Runtime.Serialization.DataContractAttribute(Name="Status", Namespace="urn:microsoft-dynamics-schemas/page/salesheaderpage")] 
public enum Status : int { 

    [System.Runtime.Serialization.EnumMemberAttribute()] 
    Open = 0, 

    [System.Runtime.Serialization.EnumMemberAttribute()] 
    Released = 1, 

    [System.Runtime.Serialization.EnumMemberAttribute()] 
    Pending_Approval = 2, 

    [System.Runtime.Serialization.EnumMemberAttribute()] 
    Pending_Prepayment = 3, 
} 

Я уже пытался отмените Reuse types in referenced assemblies но дублированные определения еще генерируются в обоих случаях ,

любые идеи?

EDIT: Страница обычай Страница подключен к стандартной таблице 36 (Sales Header)

+1

Какая версия Nav? 2009 или 2013? –

+0

версия 2009 R2 –

+0

Нужна больше информации Я верю. Пытался воспроизвести его, не может. Мой VS2010 генерирует только первую версию поля (с именами Open, Release и т. Д.) Возможно, что-то не так со страницей, которую вы публикуете. Я протестировал его на стр. 42, который основан на заголовке Sales, аналогичном вашему. –

ответ

8

Проблема, кажется, что сериализации дважды происходит:

//Xml Serializer 
[System.Xml.Serialization.XmlTypeAttribute(... 

//DataContract Serializer 
[System.Runtime.Serialization.DataContractAttribute(... 

Предполагая, что нет ни одного сервера -side вопросы:

  • Первое, что нужно проверить, является то, что у вас нет каких-либо перечислений локально с тем же именем, так как он часто ломает типы повторного использования.

  • Кроме того, с использованием Add Web Reference следует указать рабочий код.

  • Если другие вопросы не устранили проблему (или они вам не полезны, даже если они производят рабочий код), я бы попытался с помощью svcutil вручную создать прокси-класс через определенный сериализатор. Поскольку динамика услуга должна быть XML те, я бы с /serializer:XmlSerializer (EDIT: Я неправильно набранного параметром командной строки!)

Команда может выглядеть следующим образом:

svcutil <ServiceURL> /Language:CS /target:Code 
/out:MyServiceProxy.cs /config:MyServiceProxy.config /serializer:XmlSerializer 

По умолчанию расположения инструмента должен быть %ProgramFiles%\Microsoft SDKs\Windows\v6.0\Bin в соответствии с MSDN Reference for the tool (Framework ver 4.0)

+0

Hi @Alex, спасибо за ответ. 1) нет других перечислений, я начал пустой проект, чтобы избежать этих проблем. 2) Web Reference создает рабочий код, но мне нужно использовать эти WS из Service Reference 3) Я попытаюсь создать прокси-сервер, используя svcutil, можете ли вы укажите в качестве примера полную командную строку? Большое спасибо –

+0

Я расширил ответ – Alex

+0

с вашим обходным решением (для использования svcutil) Я решил свою проблему, теперь у меня может быть прокси без дублированных определений (нужно исправить пространства имен и app.config, но это мелочи). Потому что вопрос заключается в том, почему стандартная ссылка на службу генерирует дубликаты, я буду держать открытым вопрос на 7 дней для возможных ответов, но если никто другой не выйдет, я установлю ваше согласие и дам вам щедрость. Еще раз спасибо! –

0

Я видел эту проблему раньше, и это произошло, когда у меня было приложение WPF и служба WCF, совместно использующая общую сборку в качестве средства сериализации/десериализации данных между ними.

Проблема, по-видимому, возникла из-за того, что общая сборка имела название названия проекта .

Это было некоторое время назад, поэтому моя память несколько туманна, но я считаю, что я переименовал сборку в соответствие с именем проекта, а затем она отлично работала.

По-видимому, о них сообщают другие пользователи here.

Это соответствует вашей ситуации?

2

Я знаю, что это было некоторое время на этот вопрос, но только в случае, если кто-то сталкивается с аналогичной проблемой:

При добавлении ServiceReference к вашему проекту VS, важно использовать точный адрес, связанный с веб-сервиса у вас есть exposed-- именно:

не открывать все объекты веб-службы, введя:

http://navserver.domain.com:7047/DynamicsNAV/WS/services

, а затем выберите объект веб-службы из списка.

Вместо ссылки на объект веб-службы в частности, как в:

http://navserver.domain.com:7047/DynamicsNAV/WS/%PercentEncodedCompanyNameHere%/page/salesheaderpage

Это должно спасти вас от удаления дополнительных ссылок.

Это не является проблемой при добавлении веб-ссылки на ваш проект он является уникальным для ServiceReferences

4

Вот что установил ее для меня:

  1. Добавить ссылку на службу, как обычно
  2. В «Solution explorer» выберите значок «Показать все файлы»
  3. Откройте ссылку Reference.svcmap только что добавленной ссылки на службу
  4. Изменить строку <Serializer>Auto</Serializer>
  5. Для <Serializer>XmlSerializer</Serializer>
  6. Обновление службы ссылки

Похоже, что в некоторых версиях Visual Studio функция «Добавить ссылку на службу» не может автоматически определить, нужно ли использовать XMLSerializer ог DataContractSerializer. Таким образом, это заставляет его использовать XmlSerializer.

+0

спасибо за ваш ответ. Я не знаю, когда смогу попробовать ваше решение, но я опубликую свои результаты. –

+0

Сладкий! Спасибо за Ваш ответ. Я переносил старые проекты на vs2015 и получал массу ошибок. Этот ответ устранил все мои проблемы. – Louis

0

Это может быть полезно кому-то. Я добавлял службу postcodeanywhere в приложение и сохранял такую ​​же ошибку. Я изменил пул приложений IIS, чтобы разрешить 32 бит, и он сразу же начал работать. Я понятия не имею, почему это должно быть так, но это сработало для меня.

0

Я рекомендую всегда хранить справочную ссылку в своей DLL, чтобы было легче отменять изменения. «Svcutil» теперь «старый», а иногда и запутывается.

Вот моя история ...

Я использую эту служебную ссылку для YEARS и обновляю ее в основном без ussue. Мне нужен тип Binary от System.Data.Linq, поэтому я проверил эту сборку.

enter image description here

Каким-то образом он получил совершенно запутался и создали дополнительный Reference1.cs, который дублируется ВСЁ в Reference.cs (вы можете увидеть это новый файл, из-за +).

enter image description here

Даже когда я сделал Undo pending changes, чтобы попытаться восстановить этот дополнительный файл остался без символа +, но я до сих пор есть дубликаты.

enter image description here

Я закончил тем, что полностью удалить ссылку и создать его заново.

Как я сказал, гораздо безопаснее создать отдельный проект/DLL для вашей справки по сервису, поэтому, когда что-то происходит (редко, но это происходит), вы можете легко его исправить.