Совместное использование типов данных из нескольких веб-ссылок - PullRequest
3 голосов
/ 18 февраля 2009

Скажем, поставщик предоставил два отдельных веб-сервиса, которые оба используют одни и те же типы данных и одно и то же пространство имен.

например. Следующие веб-сервисы содержат похожие объекты, например объект TestCredentials:

  • TestWebservice / Testwebservice1.asmx
  • TestWebservice / Testwebservice2.asmx

Включение их в Visual Studio с использованием веб-ссылок, которые я заканчиваю:

  • Testwebservice1.TestCredentials
  • Testwebservice2.TestCredentials

Когда я действительно хочу:

  • Testwebservice.TestCredentials

Есть ли способ в Visual Studio при работе с веб-ссылками связать эти два веб-сервиса вместе, чтобы сгенерированные прокси-классы были одинаковыми (и в одном и том же пространстве имен)?

Ответы [ 6 ]

2 голосов
/ 01 марта 2009

Вам придется вручную генерировать прокси-классы с помощью программы wsdl.exe с ключом / sharetypes .

2 голосов
/ 18 февраля 2009

Другой возможный вариант (наряду с wsdl.exe / sharetypes) - использовать Visual Studio 2008 и использовать «Добавить ссылку на службу». Диалоговое окно «Добавить ссылку на службу» предоставляет параметры для повторного использования типов.

1 голос
/ 18 февраля 2009

Вместо добавления веб-ссылок в Visual Studio следует использовать инструмент командной строки wsdl.exe , чтобы создать прокси-класс, который можно затем отредактировать для принятия URL-адреса вместо двух с жестко закодированным URL-адреса в отдельных пространствах имен.

0 голосов
/ 19 февраля 2009

Вы можете создать простой файл .disco, который ссылается на все веб-сервисы. Это просто простой contractRef для каждого веб-сервиса.

Visual Studio будет совместно использовать типы, если они используют одно и то же пространство имен xml.

0 голосов
/ 18 февраля 2009

Да, вы можете это сделать. Мы называем это маршаллером данных, но в этом примере я назову его консолидатором.

Вы заметите, что сгенерированный WSDL класс является частичным, мы создаем файл (имя веб-ссылки) .cs и имеем что-то вроде:

Ниже приведены файлы, которые вы создаете, а не файлы, сгенерированные WSDL

WebReference1.cs


public partial class WebReferenceName1 : System.Web.Services.Protocols.SoapHttpClientProtocol 
{
    // take the methodname and append Local to the end
    public Consolidated.ReturnType MethodName1Local(params)
    {
        // redirect the return value of the call to the consolidation method and return the new value
        return Consolidation.Convert(this.MethodName1(params);
    }
}

затем второй веб-сервис

WebReference2.cs


public partial class WebReferenceName2 : System.Web.Services.Protocols.SoapHttpClientProtocol 
{
    // take the methodname and append Local to the end
    public Consolidated.ReturnType MethodName2Local(params)
    {
        // redirect the return value of the call to the consolidation method and return the new value
        return Consolidation.Convert(this.MethodName2(params);
    }
}

и теперь класс, который конвертирует из двух типов

Consolidator.cs


public class Consolidation
{
    // Input from Web Reference #1
    public static Consolidated.ReturnType Convert(WebReferenceName1.ReturnType valuetoConvert)
    {
        // Convert from valuetoConvert to Consolidated.ReturnType
        convertedValue = (conversion of valuetoConvert to Consolidated.ReturnType);

        return convertedValue;
    }

    // Input from Web Reference #2
    public static Consolidated.ReturnType Convert(WebReferenceName2.ReturnType valuetoConvert)
    {
        // Convert from valuetoConvert to Consolidated.ReturnType
        convertedValue = (conversion of valuetoConvert to Consolidated.ReturnType);

        return convertedValue;
    }
}

По сути, вы добавляете методы в веб-ссылку, вызываете методы {WebMethod} Local (), и они направляются через Consolidator и преобразуют простой сгенерированный WSDL-класс в то, что вы действительно можете использовать.

Consolidated.ReturnType - это то, что вы определяете в своем локальном проекте, это локальная версия типа данных, сгенерированная WSDL по веб-ссылке. Обычно «преобразование» - это просто клонирование / свойство путем копирования свойства из одного типа в другой.

0 голосов
/ 18 февраля 2009

Я не верю, по крайней мере, не возиться с автоматически сгенерированным кодом reference.cs.

Что приходит на ум, это несколько обходных путей: 1) создать метод копирования на основе отражений, который копирует значения на основе имен свойств или 2) если вы используете .NET 3.5, напишите метод расширения для копирования между двумя типами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...