2011-04-04 34 views
0

我有一些(非.Net)Web服務我想從一個WCF客戶端使用。svcutil爲多個WSDL和獨特的XSD文件?

我有所有這些服務的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提前

[編輯]在我的問題的可能原因之一是,所有的業務定義相同的端口名稱:

<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> 

回答

2

我終於可以使用一個糟糕的powershell腳本來取消所有的一切了。

關鍵的想法是爲所有服務指定一個自定義名稱空間。 但是由於一些部分(返回類型)在所有服務中共享,我不得不從XSD中提取這些類型並引用它。過程是這樣的一個:如果需要最新的WSDL文件

  • 建立路徑工具
  • 創建一個臨時DLL在XSD文件中定義
  • 編譯類型的CS文件

    1. 下載這個cs文件爲
    2. 對於每個服務,使用svcutil來創建代理。注意/r:Temp.dll要求 「共享」 常見類型
    3. 刪除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