svcutil для кратных WSDL и уникального файла XSD? - PullRequest
0 голосов
/ 04 апреля 2011

У меня есть некоторые (не .Net) веб-службы, которые я хочу использовать из клиента WCF.

У меня есть файл WSDL для всех этих служб.Каждый из них ссылается на один и тот же XSD-файл, который определяет все типы.

Я не знаю, как правильно обращаться с svcutil.exe в этом случае.

Если я запускаю:

svcutil.exe WS1.wsdl types.xsd

Работает хорошо.

Если выполнить одно из следующих действий, произойдет сбой:

svcutil.exe *.wsdl types.xsd

svcutil.exe ws1.wsdl ws2.wsdl types.xsd

svcutil.exe ws1.wsdl types.xsd
svcutil.exe ws2.wsdl types.xsd

(эта работает для обеих строк, но когда я компилирую, типы определяются несколько раз)

svcutil.exe /ImportXmlTypes types.xsd
// Compile a VS Project this the types.Cs file
svcutil.exe ws1.wsdl /r:types.dll

Поскольку в каждой службе используются одинаковые типы результатов, я не хочуповторяющийся код (т. е. у меня не может быть разного типа «Результат» для всех служб).

Какие у меня варианты?Я борюсь с этим простым случаем ...

thx заранее

[Edit] Вероятной причиной моей проблемы является то, что все службы определяют одно и то же имя порта:

<service name="service 1">
    <port name="lbWebPort" binding="y:lbWebBinding">
        <soap:address location="xxx"/>
    </port>
</service>
...
<service name="service 2">
    <port name="lbWebPort" binding="y:lbWebBinding">
        <soap:address location="xxx"/>
    </port>
</service>

1 Ответ

2 голосов
/ 04 апреля 2011

Я наконец-то смог отключить все, используя ужасный скрипт powershell.

Ключевая идея состоит в том, чтобы задать пользовательское пространство имен для всех сервисов.Но так как некоторые части (типы возврата) являются общими для всех служб, мне пришлось извлечь типы из XSD и сослаться на него.процесс такой:

  1. Загрузите, если необходимо, последние файлы wsdl
  2. Путь установки для инструментов
  3. создайте файлы cs из типов, определенных в xsdfiles
  4. Скомпилируйте во временную папку. Это cs файлы
  5. для каждой службы, используйте svcutil для создания прокси.Обратите внимание на /r:Temp.dll, необходимый для «общего доступа» к общим типам
  6. для удаления файла temp.dll

        $web = new-object System.Net.WebClient
    $currDir = (get-item WSDefinition).FullName
    
    if($false) // Set to true if wsdl changed
    {
        $web.DownloadFile("http://urlofmywebservice/majClient/lbWebPort?wsdl","$currDir\CustomerServiceMajClientImpl.wsdl")
        $web.DownloadFile("http://urlofmywebservice/lotClient/lbWebPort?wsdl","$currDir\CustomerServiceLotClientImp.wsdl")
        $web.DownloadFile("http://urlofmywebservice/interlocuteur/lbWebPort?wsdl","$currDir\CustomerServiceInterlocuteursImp.wsdl")
        $web.DownloadFile("http://urlofmywebservice/cdeConf/lbWebPort?wsdl","$currDir\CustomerServiceCdeConfirmationImp.wsdl")
        $web.DownloadFile("http://urlofmywebservice/cdeLignes/lbWebPort?wsdl","$currDir\CustomerServiceCdeLignesImp.wsdl")
        $web.DownloadFile("http://urlofmywebservice/cdeTete/lbWebPort?wsdl","$currDir\CustomerServiceCdeTeteImp.wsdl")
        $web.DownloadFile("http://urlofmywebservice/majDevis/lbWebPort?wsdl","$currDir\CustomerServiceDevisImp.wsdl")
    }
    
    $svcutil = get-item ((get-item 'Env:\ProgramFiles(x86)').Value + "\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\svcutil.exe")
    $csc = get-item ((get-item 'Env:\SystemRoot').Value + "\Microsoft.NET\Framework64\v4.0.30319\csc.exe")
    
    & $svcutil WSDefinition\CustomerServiceTypes.xsd /importxmltypes /i /dconly /n:"*,MyCustomer.Project.Interfaces.Erp.WebServices.MyCustomer" /o:MyCustomer\Types.cs 
    
    & $csc /target:library /out:temp.dll MyCustomer\Types.cs
    
    & $svcutil WSDefinition\CustomerServiceMajClientImpl.wsdl WSDefinition\CustomerServiceTypes.xsd /config:MyCustomerServices.config /mc /a /i /n:"*,MyCustomer.Project.Interfaces.Erp.WebServices.MyCustomer.MajClient"  /o:MyCustomer\MajClient.cs /s /tcv:Version35 /r:temp.dll
    & $svcutil WSDefinition\CustomerServiceLotClientImp.wsdl WSDefinition\CustomerServiceTypes.xsd /mergeconfig /config:MyCustomerServices.config /mc /a /i /n:"*,MyCustomer.Project.Interfaces.Erp.WebServices.MyCustomer.LotClient"  /o:MyCustomer\LotClient.cs /s /tcv:Version35 /r:temp.dll
    & $svcutil WSDefinition\CustomerServiceInterlocuteursImp.wsdl WSDefinition\CustomerServiceTypes.xsd /mergeconfig /config:MyCustomerServices.config /mc /a /i /n:"*,MyCustomer.Project.Interfaces.Erp.WebServices.MyCustomer.Interlocuteurs"  /o:MyCustomer\Interlocuteurs.cs /s /tcv:Version35 /r:temp.dll
    & $svcutil WSDefinition\CustomerServiceCdeConfirmationImp.wsdl WSDefinition\CustomerServiceTypes.xsd /mergeconfig /config:MyCustomerServices.config /mc /a /i /n:"*,MyCustomer.Project.Interfaces.Erp.WebServices.MyCustomer.CdeConfirmation"  /o:MyCustomer\CdeConfirmation.cs /s /tcv:Version35 /r:temp.dll
    & $svcutil WSDefinition\CustomerServiceCdeLignesImp.wsdl WSDefinition\CustomerServiceTypes.xsd /mergeconfig /config:MyCustomerServices.config /mc /a /i /n:"*,MyCustomer.Project.Interfaces.Erp.WebServices.MyCustomer.CdeLignes"  /o:MyCustomer\CdeLignes.cs /s /tcv:Version35 /r:temp.dll
    & $svcutil WSDefinition\CustomerServiceCdeTeteImp.wsdl WSDefinition\CustomerServiceTypes.xsd /mergeconfig /config:MyCustomerServices.config /mc /a /i /n:"*,MyCustomer.Project.Interfaces.Erp.WebServices.MyCustomer.CdeTete"  /o:MyCustomer\CdeTete.cs /s /tcv:Version35 /r:temp.dll
    & $svcutil WSDefinition\CustomerServiceDevisImp.wsdl WSDefinition\CustomerServiceTypes.xsd /mergeconfig /config:MyCustomerServices.config /mc /a /i /n:"*,MyCustomer.Project.Interfaces.Erp.WebServices.MyCustomer.Devis"  /o:MyCustomer\Devis.cs /s /tcv:Version35 /r:temp.dll
    
    Remove-Item temp.dll
    
...