Классы обмена веб-ссылками - PullRequest
4 голосов
/ 17 мая 2011

Я написал несколько SOAP Web-сервисов на Java, работающих на JBoss 5.1.Двое из них делят класс, AddressTO.Веб-сервисы правильно разворачиваются на моем ApplycationServer, и все прошло хорошо, пока я не попытаюсь использовать класс addressTO в моем C # -клиенте.В клиентском приложении есть два типа, addressTO и addressTO1.Это проблема, потому что это приводит к ошибкам типа:

    Fehler  1   Eine implizite Konvertierung vom Typ 
    "acsysteme.i4workspace.client.webservices.addressTO1[]" in 
    "acsysteme.i4workspace.client.webservices.addressTO[]" ist nicht möglich.   
    [...]

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

Веб-ссылки для C # -клиента создаются командой

    wsdl.exe /parameters:CreateWebService.xml

XML-файл содержит URL-адреса дляразличные .wsdl-файлы моих веб-сервисов.

Кто-нибудь знает, как решить эту проблему?

Ответы [ 2 ]

3 голосов
/ 17 мая 2011

Используйте параметр /sharetypes при вызове wsdl.exe:

/ sharetypes Включает функцию обмена типами.Эта функция создает один файл кода с определением одного типа для идентичных типов, совместно используемых различными службами (пространство имен, имя и проводная подпись должны быть идентичны).Ссылка на службы с URL-адресами http: // в качестве параметров командной строки или создание документа discomap для локальных файлов.

Если классы точно совпадают, они должны генерироваться только один раз, если вы генерируете код для обоихуслуги в одной команде.Обе службы будут использовать один и тот же класс, поэтому преобразование не потребуется.

Редактировать:

Если пространства имен XML не совпадают (что является обычным явлением), .NET рассмотрит ихбыть разными, и это правильно.Вам нужно будет либо исправить веб-службы, чтобы типы были точно такими же (рекомендуется), либо выполнить преобразование между двумя сгенерированными типами.Это приведет к большому количеству скучного кода присваивания свойств, поэтому вы можете использовать что-то вроде AutoMapper для обработки преобразования.

wsdl.exe должен генерировать частичноеклассы , поэтому, если хотите, вы можете определить неявные преобразования между различными типами:

public static implicit operator addressTO1(addressTO source)
{
    addressTO1 result = new addressTO1();
    // Assign properties, etc.
    return result;
}

Обычно я сам не большой поклонник неявных преобразований, но вв этом случае это может быть оправдано.

1 голос
/ 19 мая 2011

Я решил это!

Я последовал подсказке Торарина, чтобы использовать wsdl.exe вариант sharetypes.Но использовать эту опцию не достаточно.Во-первых, вам нужно настроить правильное пространство имен (используя URI) в классе Webservice на вашем Java-сервере со следующей аннотацией:

@WebService(targetNamespace="http://com/project/client/webservices/")
public class WebServiceImplementation implements WebService{
      // ... your @WebMethod-methods
}

Во-вторых, вам необходимо соответствующим образом изменить настройки в createWebService.xml:Пространство имен веб-службы необходимо добавить следующим образом:

<wsdlParameters xmlns="http://microsoft.com/webReference/"> 
    <!-- Defaultsettings -->
    <language>CS</language> 
    <sharetypes>true</sharetypes>      
    <namespace>com.project.client.webservices</namespace> 

    <!-- output --> 
    <out>soap/WebServices.cs</out> 

    <appSettingUrlKey>BaseUrl</appSettingUrlKey>         
    <appSettingBaseUrl>http://localhost:8080</appSettingBaseUrl> 

    <!-- web service locations --> 
    <documents> 
        <document>http://localhost:8080/Core?wsdl</document>       
        <document>http://localhost:8080/WebService0?wsdl</document>    
        <document>http://localhost:8080/WebService1?wsdl</document> 
    </documents> 
</wsdlParameters>

Вот и все!Позвоните wsdl.exe /parameters:createWebService.xml и все готово.

Спасибо за помощь!

...