用java调用.net的wcf其实还是很简单的
? 前些天和我們的一個郵件服務(wù)商對接,雙方需要進(jìn)行一些通訊,對方是java團(tuán)隊(duì),而作為.net團(tuán)隊(duì)的我們,只能公布出去的是一個wcf的basicbinding,想不
到問題來了,對方不知道怎么去調(diào)用這個basic,可能他們水平有點(diǎn)菜,有點(diǎn)尷尬,不得已我來研究研究,其實(shí)只要知道公布的wsdl,對什么語言都是很簡單的。
?
一:案例
? ? ? 為了方便,我也不特意寫什么代碼了,就用vs里面的wcf服務(wù)模板創(chuàng)建一下,詳細(xì)內(nèi)容如下:
1 // 注意: 使用“重構(gòu)”菜單上的“重命名”命令,可以同時(shí)更改代碼、svc 和配置文件中的類名“Service1”。 2 // 注意: 為了啟動 WCF 測試客戶端以測試此服務(wù),請?jiān)诮鉀Q方案資源管理器中選擇 Service1.svc 或 Service1.svc.cs,然后開始調(diào)試。 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運(yùn)行一下,就可以看到這樣的一個wcf測試客戶端,有服務(wù)地址,有提供的兩個方法契約。
?
?
二:java調(diào)用
1. 使用web service client
? ? ?其實(shí)在eclipse的新建項(xiàng)目中有一個Web Service Client 模板,這個里面就可以將wsdl轉(zhuǎn)換為proxy的java代碼,有一點(diǎn)像C#中的服務(wù)引用,是不是,
下面就一步一步操作下:
《1》 新建一個java project,或者dynamic web project都是可以的,本次測試只新建一個MyJavaTest 的project。
?
《2》 然后使用 WebService Client的模板 File ?=> Other =>Web Services => Web Service Client 即可。
?
《3》在Service definition 選項(xiàng)中輸入我們的wcf服務(wù)地址:http://localhost:54248/Service1.svc?wsdl,一定要注意
? ? ? ? ?在svc后面加上一個wsdl,這樣就方便java proxy找到哈,然后左下角有一個“溫度計(jì)”,調(diào)到start client 模式就
? ? ? ? 好,然后繼續(xù)點(diǎn)擊下一步,詳細(xì)如下圖:
?
《4》 下圖就表示生成好的代碼將放入到哪一個目錄下,這個沒什么好說的。
?
《5》然后點(diǎn)擊finish,現(xiàn)在你會發(fā)現(xiàn),你多了幾個自動化的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小工具
? ? ? ? 其實(shí)java的jdk里面有很多的實(shí)用小工具,其中就有一款wsimport.exe,它就可以用來根據(jù)wsdl生成自動化的proxy類,和.net的svcutil的功能
是一樣的。
?
? 由于jdk路徑都配置到了環(huán)境變量中,就可以在cmd中看一下wsimport需要的參數(shù)。
C:\Users\hxc>wsimport 缺少 WSDL_URI用法: wsimport [options] <WSDL_URI>\其中 [options] 包括:-b <path> 指定 jaxws/jaxb 綁定文件或附加模式(每個 <path> 都必須具有自己的 -b)-B<jaxbOption> 將此選項(xiàng)傳遞給 JAXB 模式編譯器-catalog <file> 指定用于解析外部實(shí)體引用的目錄文件支持 TR9401, XCatalog 和 OASIS XML 目錄格式。-d <directory> 指定放置生成的輸出文件的位置-encoding <encoding> 指定源文件所使用的字符編碼-extension 允許供應(yīng)商擴(kuò)展 - 不按規(guī)范指定功能。使用擴(kuò)展可能會導(dǎo)致應(yīng)用程序不可移植或無法與其他實(shí)現(xiàn)進(jìn)行互操作-help 顯示幫助-httpproxy:<host>:<port> 指定 HTTP 代理服務(wù)器 (端口默認(rèn)為 8080)-keep 保留生成的文件-p <pkg> 指定目標(biāo)程序包-quiet 隱藏 wsimport 輸出-s <directory> 指定放置生成的源文件的位置-target <version> 按給定的 JAXWS 規(guī)范版本生成代碼默認(rèn)為 2.2, 接受的值為 2.0, 2.1 和 2.2例如, 2.0 將為 JAXWS 2.0 規(guī)范生成兼容的代碼-verbose 有關(guān)編譯器在執(zhí)行什么操作的輸出消息-version 輸出版本信息-wsdllocation <location> @WebServiceClient.wsdlLocation 值-clientjar <jarfile> 創(chuàng)建生成的 Artifact 的 jar 文件以及調(diào)用 Web 服務(wù)所需的 WSDL 元數(shù)據(jù)。-generateJWS 生成存根 JWS 實(shí)現(xiàn)文件-implDestDir <directory> 指定生成 JWS 實(shí)現(xiàn)文件的位置-implServiceName <name> 生成的 JWS 實(shí)現(xiàn)的服務(wù)名的本地部分-implPortName <name> 生成的 JWS 實(shí)現(xiàn)的端口名的本地部分\擴(kuò)展:-XadditionalHeaders 映射標(biāo)頭不綁定到請求或響應(yīng)消息不綁定到Java 方法參數(shù)-Xauthfile 用于傳送以下格式的授權(quán)信息的文件:http://username:password@example.org/stock?wsdl-Xdebug 輸出調(diào)試信息-Xno-addressing-databinding 允許 W3C EndpointReferenceType 到 Java 的綁定-Xnocompile 不編譯生成的 Java 文件-XdisableAuthenticator 禁用由 JAX-WS RI 使用的驗(yàn)證程序,將忽略 -Xauthfile 選項(xiàng) (如果設(shè)置)-XdisableSSLHostnameVerification 在提取 wsdl 時(shí)禁用 SSL 主機(jī)名驗(yàn)證\示例:wsimport stock.wsdl -b stock.xml -b stock.xjbwsimport -d generated http://example.org/stock?wsdl C:\Users\hxc>這其中,大概知道下面4個參數(shù)就好說了。
《1》 url: 你需要生成代理類的數(shù)據(jù)源,也就是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驗(yàn)證啦~~~
?
最后還有一種笨的方法,那就是通過fiddler抓取webservice通訊的參數(shù),然后通過httppost模擬提交,也是可以的。。。好了,本篇就和大家說到
這里,希望對你有幫助。
?
總結(jié)
以上是生活随笔為你收集整理的用java调用.net的wcf其实还是很简单的的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “威胁情报”在手,反黑客终于有地图了!
- 下一篇: js 深复制一个对象