各個系統之間進行數據交互是重要的部分,WebService是一個平臺獨立的,低耦合的,自包含的、基於可編程的web的應用程式,使用較為方便,閑話少說,正式進入到關於在.Net中調用java開發的介面。 目前JAVA開發WebService的方式很很多種:Axis2、CXF、xfire等等,但是在.N ...
各個系統之間進行數據交互是重要的部分,WebService是一個平臺獨立的,低耦合的,自包含的、基於可編程的web的應用程式,使用較為方便,閑話少說,正式進入到關於在.Net中調用java開發的介面。
目前JAVA開發WebService的方式很很多種:Axis2、CXF、xfire等等,但是在.Net中調用這些介面無法實現配置IP的形式進行替換調用服務,那這個問題該如何解決?
筆者測試發現相同框架開發的介面是可以進行配置URL來改變調用介面,前提是需要對JAVA基於不同框架的介面進行引用,在Visual Stuido中引用服務的方式在這裡不多說,如下圖引用方式進行引用:
引用完成後通過動態改變 URL來改變調用介面
1 WebService_SX.Service objService_sx = new WebService_SX.Service(); 2 objService_sx.Url = url; 3 str = objService_sx.Process(XmlStr);同理,當需要調用其他java介面時通過引用一個服務之後通過配置進行調用。 如何實現配置化調用介面呢? 我的方式在web.config裡面配置要調用的標識和該標識對應的url,通過標識去識別不同的URL,代碼如下: web.config
<!--標識串--> <add key="orgCodeList_axis2" value="1,2" /> <add key="orgCodeList_cxf" value="3,4" /> <add key="orgCodeList_xfire" value="" /> <add key="orgCodeList_java" value="" /> <!--標識對應的服務地址--> <add key="orgCodeListAndUrl_axis2" value="1,http://220.191.238.67:9091/axis2/services/;2,http://220.191.238.67:9092/axis2/services/" /> <add key="orgCodeListAndUrl_cxf" value="3,http://220.191.238.67:82/zy;4,http://220.191.238.67:84/zy" /> <add key="orgCodeListAndUrl_xfire" value=""/> <add key="orgCodeListAndUrl_java" value=""/>
asmx服務中首先根據傳入xml中的標識在標識串中查找該標識屬於什麼開發,如標識1屬於axis2開發,再到相應的標識對應服務地址中查找標識1所對應的服務,將之前引用axis2的服務的url替換為該服務地址,即可進行正確調研不抱錯。
[WebMethod] public string Process(string XmlStr) { string orgCodeList_axis2 = ConfigurationManager.AppSettings["orgCodeList_axis2"].Trim(); string orgCodeList_cxf = ConfigurationManager.AppSettings["orgCodeList_cxf"].Trim(); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(XmlStr); string str = ""; string orgCode = ""; string type = ""; string url = "";
orgCode = this.GetParam(xmlDoc, "body/resquest/", "ORG_CODE", null);
if (orgCodeList_axis2.IndexOf(orgCode) > -1) { type = "axis2"; } else if (orgCodeList_cxf.IndexOf(orgCode) > -1) { type = "cxf"; } switch (type) { case "axis2": string orgCodeListAndUrl_axis2 = ConfigurationManager.AppSettings["orgCodeListAndUrl_axis2"].Trim(); url = GetUrl(orgCode, orgCodeListAndUrl_axis2); WebService_SX.Service objService_sx = new WebService_SX.Service(); if (!string.IsNullOrEmpty(url)) { objService_sx.Url = url; } str = objService_sx.Process(XmlStr); break; case "cxf": string orgCodeListAndUrl_cxf = ConfigurationManager.AppSettings["orgCodeListAndUrl_cxf"].Trim(); url = GetUrl(orgCode, orgCodeListAndUrl_cxf); WebService_QZ.Service objService_qz = new WebService_QZ.Service(); if (!string.IsNullOrEmpty(url)) { objService_qz.Url = url; } str = objService_qz.Process(XmlStr); break; default: str = "<?xml version=\"1.0\" encoding=\"utf-8\"?><body><response><ret_code>9995default</ret_code><ret_info>成功</ret_info></response></body>"; break; } return str; }
private string GetUrl(string orgCode,string List) { string WSurl = "" ; string[] array = List.Split(';'); for (int i = 0; i < array.Length; i++) { string[] detail = array[i].Split(','); if (detail[0].ToString() == orgCode) { WSurl = detail[1].ToString(); break; } } return WSurl; }
雖然代碼很簡單,但是確實這種可以通過配置解決調用java介面的問題,個人在使用中覺得還是蠻方便的,如果有更好的改進建議,歡迎交流!