У меня была та же проблема, которую вы описываете, и я попробовал оба указанных вами варианта, но не был полностью доволен ни одним из них.
Причина, по которой мы оба имеем эту проблему, по крайней мере частично, заключается в том, что решение совместно используемой библиотеки между потребителем и поставщиком веб-службы является нарушением принятых шаблонов и практики дизайн веб-сервисов . Что касается потребителя, то должно быть , чтобы знать интерфейс, опубликованный в WSDL
Тем не менее, если вы готовы принять тесную связь между вашим поставщиком веб-услуг и потребителем веб-услуг, и вы знаете , что ваш текущий клиент никогда не будет заменен другим клиентом (который может не быть в состоянии ссылаться на разделяемую библиотеку), тогда я понимаю, почему предлагаемое решение кажется изящным способом структурировать ваше приложение. ВАЖНОЕ ПРИМЕЧАНИЕ: Можем ли мы действительно честно ответить да на оба этих вопроса? Вероятно, нет.
Подведем итог:
- Проблема возникает, когда у вас есть классы (например, строго типизированный набор данных), определенные в некоторой общей библиотеке (используемой как на клиенте, так и на сервере).
- Некоторые из ваших общих классов используются в интерфейсе, определенном вашим веб-сервисом.
- Когда добавляется веб-ссылка, в пространстве имен веб-ссылки определяются классы прокси (для ваших общих классов).
- Из-за различных пространств имен прокси-класс и его фактический аналог в общей библиотеке несовместимы.
Вот четыре решения, которые можно попробовать, если вы хотите продолжить настройку общей библиотеки:
- Не. Используйте прокси-класс на стороне клиента. Вот как это должно быть сделано. Он работает нормально, если только вы не хотите одновременно использовать аспекты общей библиотеки, которые не предоставляются веб-службой WSDL.
- Реализация или использование предоставленной функции копирования / дублирования класса (например, вы можете попытаться объединить () один строго типизированный набор данных в другой). Преобразование не представляется возможным, и опция копирования, как правило, тоже не очень удачное решение, поскольку она имеет нежелательные побочные эффекты. Например. Когда вы объединяете набор данных в другой, все строки в целевом наборе данных будут помечены как «измененные». Это можно было бы воскресить с помощью AcceptChanges (), но что, если пара полученных строк была фактически изменена.
- Сериализация всего - кроме элементарных типов данных - в строки (и обратно на стороне потребителя). Потеря безопасности типов является одной из важных слабостей этого подхода.
- Удалите явное объявление общего класса в Reference.cs и уберите пространство имен из общего класса, где бы оно ни упоминалось в Reference.cs. Это, наверное, лучший вариант. Вы получаете то, что вы действительно хотели. Общий класс возвращается веб-сервисом. Единственным раздражающим недостатком этого решения является то, что ваши изменения в файле reference.cs теряются при каждом обновлении веб-ссылки. Поверьте мне: это может быть серьезно раздражает.
Вот ссылка на подобное обсуждение :