用java呼叫.net的wcf其實還是很簡單的

一線碼農發表於2017-08-09

     前些天和我們的一個郵件服務商對接,雙方需要進行一些通訊,對方是java團隊,而作為.net團隊的我們,只能公佈出去的是一個wcf的basicbinding,想不

到問題來了,對方不知道怎麼去呼叫這個basic,可能他們水平有點菜,有點尷尬,不得已我來研究研究,其實只要知道公佈的wsdl,對什麼語言都是很簡單的。

 

一:案例

      為了方便,我也不特意寫什麼程式碼了,就用vs裡面的wcf服務模板建立一下,詳細內容如下:

 1     // 注意: 使用“重構”選單上的“重新命名”命令,可以同時更改程式碼、svc 和配置檔案中的類名“Service1”。
 2     // 注意: 為了啟動 WCF 測試客戶端以測試此服務,請在解決方案資源管理器中選擇 Service1.svc 或 Service1.svc.cs,然後開始除錯。
 3     public class Service1 : IService1
 4     {
 5         public string GetData(int value)
 6         {
 7             return string.Format("You entered: {0}", value);
 8         }
 9 
10         public CompositeType GetDataUsingDataContract(CompositeType composite)
11         {
12             if (composite == null)
13             {
14                 throw new ArgumentNullException("composite");
15             }
16             if (composite.BoolValue)
17             {
18                 composite.StringValue += "Suffix";
19             }
20             return composite;
21         }
22     }

 

        然後F5執行一下,就可以看到這樣的一個wcf測試客戶端,有服務地址,有提供的兩個方法契約。

 

 

二:java呼叫

1. 使用web service client

     其實在eclipse的新建專案中有一個Web Service Client 模板,這個裡面就可以將wsdl轉換為proxy的java程式碼,有一點像C#中的服務引用,是不是,

下面就一步一步操作下:

《1》 新建一個java project,或者dynamic web project都是可以的,本次測試只新建一個MyJavaTest 的project。

 

《2》 然後使用 WebService Client的模板 File  => Other =>Web Services => Web Service Client 即可。

 

《3》在Service definition 選項中輸入我們的wcf服務地址:http://localhost:54248/Service1.svc?wsdl,一定要注意

         在svc後面加上一個wsdl,這樣就方便java proxy找到哈,然後左下角有一個“溫度計”,調到start client 模式就

        好,然後繼續點選下步,詳細如下圖:

 

《4》 下圖就表示生成好的程式碼將放入到哪一個目錄下,這個沒什麼好說的。

 

《5》然後點選finish,現在你會發現,你多了幾個自動化的java類,便捷性和visual studio有的一拼。

 

好了,自動化的類都出來了,接下來我只需要新建了一個入口的Program類,是不是就可以敲定了。。。

 1 package com.datamip;
 2 
 3 import java.rmi.RemoteException;
 4 
 5 import org.tempuri.IService1Proxy;
 6 
 7 public class Program {
 8 
 9     public static void main(String[] args) throws RemoteException {
10 
11         IService1Proxy proxy = new IService1Proxy();
12 
13         String result = proxy.getData(12345);
14 
15         System.out.println(result);
16     }
17 
18 }

不過要吐槽的是,IService1Proxy居然是一個類,我還以為是介面呢,思維定勢吧~~~

 

2. 使用wsimport小工具

        其實java的jdk裡面有很多的實用小工具,其中就有一款wsimport.exe,它就可以用來根據wsdl生成自動化的proxy類,和.net的svcutil的功能

是一樣的。

 

  由於jdk路徑都配置到了環境變數中,就可以在cmd中看一下wsimport需要的引數。

C:\Users\hxc>wsimport
缺少 WSDL_URI


用法: wsimport [options] <WSDL_URI>

\其中 [options] 包括:
  -b <path>                 指定 jaxws/jaxb 繫結檔案或附加模式
                            (每個 <path> 都必須具有自己的 -b)
  -B<jaxbOption>            將此選項傳遞給 JAXB 模式編譯器
  -catalog <file>           指定用於解析外部實體引用的目錄檔案
                            支援 TR9401, XCatalog 和 OASIS XML 目錄格式。
  -d <directory>            指定放置生成的輸出檔案的位置
  -encoding <encoding>      指定原始檔所使用的字元編碼
  -extension                允許供應商擴充套件 - 不按規範
                            指定功能。使用擴充套件可能會
                            導致應用程式不可移植或
                            無法與其他實現進行互操作
  -help                     顯示幫助
  -httpproxy:<host>:<port>  指定 HTTP 代理伺服器 (埠預設為 8080)
  -keep                     保留生成的檔案
  -p <pkg>                  指定目標程式包
  -quiet                    隱藏 wsimport 輸出
  -s <directory>            指定放置生成的原始檔的位置
  -target <version>         按給定的 JAXWS 規範版本生成程式碼
                            預設為 2.2, 接受的值為 2.0, 2.12.2
                            例如, 2.0 將為 JAXWS 2.0 規範生成相容的程式碼
  -verbose                  有關編譯器在執行什麼操作的輸出訊息
  -version                  輸出版本資訊
  -wsdllocation <location>  @WebServiceClient.wsdlLocation 值
  -clientjar <jarfile>      建立生成的 Artifact 的 jar 檔案以及
                            呼叫 Web 服務所需的 WSDL 後設資料。
  -generateJWS              生成存根 JWS 實現檔案
  -implDestDir <directory>  指定生成 JWS 實現檔案的位置
  -implServiceName <name>   生成的 JWS 實現的服務名的本地部分
  -implPortName <name>      生成的 JWS 實現的埠名的本地部分

\擴充套件:
  -XadditionalHeaders              對映標頭不繫結到請求或響應訊息不繫結到
                                   Java 方法引數
  -Xauthfile                       用於傳送以下格式的授權資訊的檔案:
                                   http://username:password@example.org/stock?wsdl
  -Xdebug                          輸出除錯資訊
  -Xno-addressing-databinding      允許 W3C EndpointReferenceType 到 Java 的繫結
  -Xnocompile                      不編譯生成的 Java 檔案
  -XdisableAuthenticator           禁用由 JAX-WS RI 使用的驗證程式,
                                   將忽略 -Xauthfile 選項 (如果設定)
  -XdisableSSLHostnameVerification 在提取 wsdl 時禁用 SSL 主機名
                                   驗證

\示例:
  wsimport stock.wsdl -b stock.xml -b stock.xjb
  wsimport -d generated http://example.org/stock?wsdl


C:\Users\hxc>

這其中,大概知道下面4個引數就好說了。

《1》 url: 你需要生成代理類的資料來源,也就是wsdl檔案

《2》 -d:  生成的proxy檔案需要存放的路徑

《3》-p:   生成proxy類的包名。

《4》-keep:儲存生成的檔名

接下來我們就cmd試一下:

C:\Users\hxc>wsimport http://localhost:54248/Service1.svc?wsdl -d c:\\2\\ -p com.datamip.proxy -keep
正在解析 WSDL...



正在生成程式碼...


正在編譯程式碼...


C:\Users\hxc>

 

好了,接下來就可以將“資料夾2”中的proxy類copy到project中,如下圖:

 

看起來是不是很完美,那接下來要做的事情就是coding驗證啦~~~

 

最後還有一種笨的方法,那就是通過fiddler抓取webservice通訊的引數,然後通過httppost模擬提交,也是可以的。。。好了,本篇就和大家說到

這裡,希望對你有幫助。

 

相關文章