日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
C#WebService調(diào)用的三大難題

一、用C#實(shí)現(xiàn)WebService是相當(dāng)簡(jiǎn)單的事情,我們只要?jiǎng)?chuàng)建一個(gè)Web服務(wù)程序,在方法名上面加上[WebMethod],部署到IIS上,就能像訪問(wèn)Web站點(diǎn)一樣訪問(wèn)WebService。

創(chuàng)新互聯(lián)專注于企業(yè)成都全網(wǎng)營(yíng)銷、網(wǎng)站重做改版、沛縣網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5、商城系統(tǒng)網(wǎng)站開(kāi)發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為沛縣等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。

用C#編寫(xiě)客戶端時(shí),只需要將WebService添加到引用,就能像調(diào)用本地方法一樣去C# WebService調(diào)用。像這樣的例子也比比皆是,在這就不多講。

二、用C++實(shí)現(xiàn)WebService,一般會(huì)用到gsoap,具體方法見(jiàn):http://www.cppblog.com/qiujian5628/archive/2008/06/19/54019.html

三、當(dāng)做完了這些之后,并不代表WebService就能相互通訊了,現(xiàn)在我簡(jiǎn)單列舉一下問(wèn)題:

1、C#提供的WebService的URL一般形如:http://localhost/WebService.asmx,但是,C++能提供的只能是:http://localhost/。C++做客戶端的時(shí)候調(diào)用沒(méi)有問(wèn)題,但是當(dāng)C#做客戶端的時(shí)候,引用C++提供的RUL時(shí),會(huì)提示沒(méi)用執(zhí)行方法(HTTP GET method not implemented)。做C#開(kāi)發(fā)的大部分會(huì)認(rèn)為C++方提供的不是WebService,或者說(shuō)提供的WebService根本就不全,都不帶.asmx文件。做C++開(kāi)發(fā)的會(huì)認(rèn)為他傳輸?shù)臄?shù)據(jù)符合soap協(xié)議,靠http傳輸數(shù)據(jù),他就是WebService。

2、當(dāng)我們解決了第一步后,緊接著會(huì)發(fā)現(xiàn)另外一個(gè)問(wèn)題。當(dāng)我們需要傳輸自定義數(shù)據(jù)類型時(shí)(在C++中稱結(jié)構(gòu)體,在C#中稱實(shí)體),從C++返回的信息中,C#無(wú)法構(gòu)建出實(shí)體類。

3、當(dāng)傳輸?shù)男畔⒅袔в兄形淖址麜r(shí),亂碼滿天飛。

四、為了解決這些問(wèn)題,我們先簡(jiǎn)單了解一下WebService。

Web Service互操作協(xié)議棧:

〈A〉、服務(wù)發(fā)現(xiàn) (UDDI)

〈B〉、服務(wù)描述(WSDL)

〈C〉、服務(wù)調(diào)用(SOAP)

〈D〉、消息編碼 (XML)

〈E〉、傳輸網(wǎng)絡(luò)層(HTTP, TCP/IP)

其中WSDL描述WebService都有什么方法、方法有什么參數(shù),什么返回值等。SOAP(簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議(Simple Object Access Protocol)是一種輕量的、簡(jiǎn)單的、基于XML的協(xié)議。傳輸?shù)臄?shù)據(jù)就需要遵循這個(gè)協(xié)議。我比較簡(jiǎn)單得認(rèn)為傳輸?shù)臄?shù)據(jù)需要遵循這種格式。

借用微軟的這個(gè)圖描述下WebService的調(diào)用過(guò)程:

五、開(kāi)始解決問(wèn)題。作為.NET開(kāi)發(fā)人員,我們根本就接觸不到底層的東西,全被封裝了。

C++做的確實(shí)是WebService,只是他們需要給提供一個(gè)描述文檔,即.WSDL文件。使用.NET提供的wsdl.exe工具,使用命令:wsdl /o: c:\webservice.cs c:\webservice.wsdl。通過(guò)webservice.wsdl文檔,生成代理類,將代理類寫(xiě)入webservice.cs文件中。我們拷貝這個(gè)cs文件到項(xiàng)目中,將URL指向http://localhost/,就能像以往那樣使用WebService了。

當(dāng)出現(xiàn)無(wú)法傳遞復(fù)雜類型數(shù)據(jù)時(shí),是因?yàn)槭褂胓soap生成的wsdl文件與.Net中生成的wsdl文件不一樣。具體代碼如下:

 
 
 
 
  1. 〈!--operationresponseelement--〉
  2. 〈elementname="result"〉
  3. 〈complexType〉
  4. 〈sequence〉
  5. 〈elementname="a"type="xsd:int"
  6. minOccurs="1"maxOccurs="1"/〉
  7. 〈elementname="b"type="xsd:int"
  8. minOccurs="1"maxOccurs="1"/〉
  9. 〈/sequence〉
  10. 〈/complexType〉
  11. 〈/element〉
  12. 以上為gsoap生成的。返回實(shí)體result,
  13. 實(shí)體有兩個(gè)屬性:a,b。
  14. 〈s:elementname="TestResponse"〉
  15. 〈s:complexType〉
  16. 〈s:sequence〉
  17. 〈s:elementminOccurs="0"maxOccurs="1"
  18. name="TestResult"type="tns:result"/〉
  19. 〈/s:sequence〉
  20. 〈/s:complexType〉
  21. 〈/s:element〉
  22. 〈s:complexTypename="result"〉
  23. 〈s:sequence〉
  24. 〈s:elementminOccurs="1"maxOccurs="1"
  25. name="a"type="s:int"/〉
  26. 〈s:elementminOccurs="1"maxOccurs="1"
  27. name="b"type="s:int"/〉
  28. 〈/s:sequence〉
  29. 〈/s:complexType〉
  30. 以上是.NET生成的。
  31. 在下面的文件中,多出
  32. 〈s:elementname="TestResponse"〉
  33. 〈s:complexType〉
  34. 〈s:sequence〉
  35. 〈s:elementminOccurs="0"maxOccurs="1"
  36. name="TestResult"type="tns:result"/〉
  37. 〈/s:sequence〉
  38. 〈/s:complexType〉
  39. 〈/s:element〉

這個(gè)便是.NET中用來(lái)構(gòu)造實(shí)體的。當(dāng)我們出現(xiàn)情況4.2時(shí),gsoap中盡量使用.NET生成的wsdl文檔,生成.h文件,以避免C++中的結(jié)構(gòu)無(wú)法在C#中轉(zhuǎn)換成實(shí)體。

第三個(gè)問(wèn)題,我們是通過(guò)將中文轉(zhuǎn)換成16進(jìn)制后傳輸過(guò)來(lái),然后再轉(zhuǎn)換成中文。下面提供C#轉(zhuǎn)換的代碼:

 
 
 
 
  1. ///〈 summary 〉
  2. ///從16進(jìn)制轉(zhuǎn)換成漢字
  3. ///〈 /summary 〉
  4. ///〈 paramname="hex" 〉〈 /param 〉
  5. ///〈 returns 〉〈 /returns 〉
  6. publicstaticstringGetChsFromHex(stringhex)
  7. {
  8. if(hex==null)
  9. thrownewArgumentNullException("hex");
  10. if(hex.Length%2!=0)
  11. {
  12. hex+="20";//空格
  13. //thrownewArgumentException
  14. ("hexisnotavalidnumber!","hex");
  15. }
  16. //需要將hex轉(zhuǎn)換成byte數(shù)組。
  17. byte[]bytes=newbyte[hex.Length/2];
  18. for(inti=0;i〈 bytes.Length;i++)
  19. {
  20. try
  21. {
  22. //每?jī)蓚€(gè)字符是一個(gè)byte。
  23. bytes[i]=byte.Parse(hex.Substring(i*2,2),
  24. System.Globalization.NumberStyles.HexNumber);
  25. }
  26. catch
  27. {
  28. //Rethrowanexceptionwithcustommessage.
  29. thrownewArgumentException("
  30. hexisnotavalidhexnumber!","hex");
  31. }
  32. }
  33. //獲得GB2312,ChineseSimplified。
  34. System.Text.Encodingchs=System.Text.Encoding.
  35. GetEncoding("gb2312");
  36. returnchs.GetString(bytes);
  37. }
  38. ///〈 summary 〉
  39. ///從漢字轉(zhuǎn)換到16進(jìn)制
  40. ///〈 /summary 〉
  41. ///〈 paramname="s" 〉〈 /param 〉
  42. ///〈 returns 〉〈 /returns 〉
  43. publicstaticstringGetHexFromChs(strings)
  44. {
  45. if((s.Length%2)!=0)
  46. {
  47. s+="";//空格
  48. //thrownewArgumentException("
  49. sisnotvalidchinesestring!");
  50. }
  51. System.Text.Encodingchs=System.Text.
  52. Encoding.GetEncoding("gb2312");
  53. byte[]bytes=chs.GetBytes(s);
  54. stringstr="";
  55. for(inti=0;i〈 bytes.Length;i++)
  56. {
  57. str+=string.Format("{0:X}",bytes[i]);
  58. }
  59. returnstr;
  60. }

注:以上來(lái)轉(zhuǎn)換代碼源于網(wǎng)絡(luò),C++中轉(zhuǎn)換的代碼也可以在網(wǎng)上找到,C++與C# WebService調(diào)用經(jīng)過(guò)以上的步驟就能基本實(shí)現(xiàn)。

三大難題到此結(jié)束,其實(shí)在整個(gè)過(guò)程中還有個(gè)最大的難題,那就是人與人的交流。因?yàn)橐环绞褂肅++,一方使用C#,語(yǔ)言不同,各自想問(wèn)題的方式也不一樣,所以需要相互理解,相互站在對(duì)方的角度想問(wèn)題。多交流、多溝通才是解決問(wèn)題之道。請(qǐng)不要抱怨C#弱智,也請(qǐng)不要怪C++繁瑣,語(yǔ)言既然存在則有他的價(jià)值。


網(wǎng)站名稱:C#WebService調(diào)用的三大難題
網(wǎng)頁(yè)URL:http://www.5511xx.com/article/ccsdpic.html