用java调用.net的wcf其实还是很简单的
? 前些天和我們的一個郵件服務商對接,雙方需要進行一些通訊,對方是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.1 和 2.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.xjbwsimport -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模擬提交,也是可以的。。。好了,本篇就和大家說到
這里,希望對你有幫助。
?
總結
以上是生活随笔為你收集整理的用java调用.net的wcf其实还是很简单的的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “威胁情报”在手,反黑客终于有地图了!
- 下一篇: js 深复制一个对象