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

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
C#WebService調(diào)用Delphi時(shí)的注意事項(xiàng)

首先我覺(jué)得有必要把.net平臺(tái)下開(kāi)發(fā)webservice進(jìn)行一個(gè)比較全面的闡述,web service的最初產(chǎn)生是在電子商務(wù)的環(huán)境下出現(xiàn)的,有些問(wèn)題通過(guò)傳統(tǒng)的手段已經(jīng)不容易解決,比如在應(yīng)用程序之間進(jìn)行商務(wù)通信、數(shù)據(jù)交換,使用DCom、CORBA等二進(jìn)制機(jī)制的東西已經(jīng)行不通了,姑且不說(shuō)他們受各自平臺(tái)的限制,比如DCom(Distribute Common Objects Model)只能在Windows平臺(tái)下進(jìn)行,而CORBA(Common Objects Request Broker Architecture)也有諸多限制。他們要實(shí)現(xiàn)應(yīng)用程序之間的數(shù)據(jù)通信是比較困難的。

在這種背景下,Web Services 應(yīng)運(yùn)而生,它很好的解決了跨語(yǔ)言、跨平臺(tái)以及良好而安全的穿透企業(yè)防火墻。它的體系結(jié)構(gòu)大體上分為五個(gè)層次:

HTTP(HyperText Transfer Protocol)信道下進(jìn)行數(shù)據(jù)通信

XML(Extensable Markup Language)數(shù)據(jù)表達(dá)形式

 SOAP(Simple Objects Access Protocol)的數(shù)據(jù)封裝

 WSDL(WebServices Description Language)的描述語(yǔ)言格式

 UDDI(Universal Description and Discovery Integration) 統(tǒng)一的描述、發(fā)現(xiàn)和集成

作為它的優(yōu)點(diǎn)跨語(yǔ)言、跨平臺(tái)以及良好而安全的穿透企業(yè)防火墻已經(jīng)足以使我們感到興奮了。不過(guò)它也存在需要改善的地方,比如:

 HTTP進(jìn)行數(shù)據(jù)通信存在速度較慢的情況,尤其是第一次聯(lián)結(jié)。需要一臺(tái)Web Server這一額外的開(kāi)銷(xiāo) 說(shuō)了WebServices的體系結(jié)構(gòu)以及其優(yōu)點(diǎn)缺點(diǎn)以后我們切入正題,那就是我們這次討論的話題:

C# Web Service調(diào)用Delphi時(shí)的問(wèn)題

我們用一個(gè)檢驗(yàn)WebMethod的Attribute的一個(gè)簡(jiǎn)單的例子進(jìn)行闡述:它是完成一次從客戶A轉(zhuǎn)帳到B的一個(gè)簡(jiǎn)單商務(wù)過(guò)程。

首先我們?cè)?NET FrameWork1.1下創(chuàng)建一個(gè)WebService,這時(shí)候.net會(huì)幫我們自動(dòng)創(chuàng)建一個(gè)Web應(yīng)用

我們需要?jiǎng)?chuàng)建一個(gè)類(lèi)AttributeTest,它是在命名空間NameSpace AttributeTesting下的,那么這個(gè)類(lèi)它將自動(dòng)繼承了它的基類(lèi) System.Web.Services.WebService,需要支出的時(shí),我們可以對(duì)這個(gè)Web應(yīng)用類(lèi)設(shè)置其WebServiceAttribute,其中基本屬性包括Description 和NameSpace

 
 
 
  1. [WebServiceAttribute(Namespace=
  2. "http://www.isdoo.com/services",
  3. Description="HelloAnsel,ThisisatestingWebService!")]
  4. publicclassAttributeTest:System.Web.Services.WebService
  5. {
  6. [WebMethodAttribute(Description="
  7. 描述信息:繼承了Count方法,并且對(duì)名稱(chēng)進(jìn)行重載。
  8. 執(zhí)行的是把錢(qián)從A用戶轉(zhuǎn)帳到B用戶......",
  9. //MessageName="ChangingMessageName",
  10. BufferResponse=true,
  11. CacheDuration=1000,
  12. EnableSession=true,
  13. TransactionOption=TransactionOption.RequiresNew)]
  14. publicstringtransMoney(doubleMoney)
  15. {
  16. try
  17. {
  18. ContextUtil.EnableCommit();
  19. //TransactiononlyusedtoDatabaseoperation!
  20. MoneyInToA(Money);
  21. MoneyOutFromB(Money);
  22. ContextUtil.SetComplete();
  23. return"TransactionSuccessful,total"+Money.ToString();
  24. }
  25. catch(Exceptione)
  26. {
  27. ContextUtil.SetAbort();
  28. return"Transactionfailed!\n\r"+e.Message;
  29. }
  30. }
  31. privatevoidMoneyInToA(doubleMoney)
  32. {
  33. SqlCommandsqlCom=newSqlCommand("updatebudgetsetMoney=
  34. Money+"+Money.ToString()+"whereName='A'");
  35. databaseAccessmyDatabase=newdatabaseAccess();
  36. sqlCom.Connection=myDatabase.getConnection();
  37. sqlCom.Connection.Open();
  38. sqlCom.ExecuteNonQuery();
  39. sqlCom.Connection.Close();
  40. //thrownewException("OperationfailedwhentransfermoneyintoA!");
  41. }
  42. privatevoidMoneyOutFromB(doubleMoney)
  43. {
  44. SqlCommandsqlCom=newSqlCommand("updatebudgetsetMoney=
  45. Money-"+Money.ToString()+"whereName='B'");
  46. databaseAccessmyDatabase=newdatabaseAccess();
  47. sqlCom.Connection=myDatabase.getConnection();
  48. sqlCom.Connection.Open();
  49. sqlCom.ExecuteNonQuery();
  50. sqlCom.Connection.Close();
  51. //thrownewException("OperationfailedwhentransfermoneyfromB!");
  52. }
  53. }

其中我們需要特別注意的是,WebMethodAttribute,這也是我們這一次需要講述的重點(diǎn)內(nèi)容,只要給一個(gè)方法加上[WebMethodAttribute],哪怕里面沒(méi)有任何屬性,那么WebService就會(huì)把這個(gè)方法暴露(Expose)給了客戶段調(diào)用者.下面我們講述一下它的6個(gè)屬性,其中包括2個(gè)描述性的信息屬性,4個(gè)功能屬性

 
 
 
  1. 描述性的信息屬性:
  2. Description 
  3. MessageName 
  4. 4個(gè)功能性屬性: 
  5. BufferResponse 
  6. CacheDuration 
  7. EnableSession 
  8. TransactionOption 

其中我們需要注意MessageName這個(gè)屬性它Delphi調(diào)用.NET平臺(tái)下開(kāi)發(fā)的WebService的時(shí)候,如果你設(shè)置了MessageName這個(gè)Attribute的話,那么客戶端調(diào)用時(shí)會(huì)報(bào)錯(cuò)誤。這也許是一個(gè)Bug,或許后面的版本會(huì)解決這個(gè)問(wèn)題。至于這幾個(gè)屬性的具體功能就不再這里詳細(xì)描述了。大家可以去看看相關(guān)的書(shū)籍。

下面我把Delphi調(diào)用webservice的步驟列舉一下:

首先如果你只是開(kāi)發(fā)調(diào)用客戶端,那么你只需要?jiǎng)?chuàng)建一個(gè)普通的應(yīng)用程序即可,然后需要你做的是,在工具欄WebServices下面找到SOAPHTTPClient這個(gè)控件,然后把它放在你的客戶端應(yīng)用窗體上;

其次就是你需要設(shè)置這個(gè)SOAPHTTPClient的屬性URL或者WSDL,這個(gè)內(nèi)容就是你的WebService的服務(wù)地址

比如我們當(dāng)前例子的服務(wù)地址是:http://localhost/AttributeTesting/AttributeTesting.asmx

如果你想輸入WSDL那么就是http://localhost/AttributeTesting/AttributeTesting.asmx?wsdl

這樣就完成了C# Web Service調(diào)用Delphi的控件設(shè)置;

然后我們需要引入服務(wù)器端的WSDL,你可以手工來(lái)做,也可以用Delphi提供的WebServices Importer功能來(lái)引入。

最后你只需要對(duì)引入的WSDL的接口進(jìn)行調(diào)用即可。在這里我們的對(duì)應(yīng)代碼是:

 
 
 
  1. procedure TForm1.BitBtn1Click(Sender: TObject); 
  2. var 
  3. aa:AttributeTestSoap;//這個(gè)就是WSDL下的類(lèi)接口對(duì)象 
  4. msg:widestring; 
  5. bb:double; 
  6. begin 
  7. //HTTPRIO2 其實(shí)就是所謂的代理類(lèi),
  8. 它負(fù)責(zé)進(jìn)行數(shù)據(jù)傳輸發(fā)送Request和接受Response的 
  9. aa:=HTTPRIO2 as AttributeTestSoap; 
  10. bb:=100.00; 
  11. msg:=aa.transMoney(bb);
  12. //這就是調(diào)用web服務(wù)所暴露給我們的web服務(wù)方法WebMethod 
  13. showmessage(msg); 
  14. end; 

這里我想再闡述一下C# Web Service調(diào)用Delphi的WebMethod的Attribute功能型屬性:

1 BufferResponse
  BufferResponse如果為true,那么服務(wù)器端會(huì)在buffer滿了的時(shí)候才會(huì)把消息數(shù)據(jù)發(fā)送給調(diào)用者;如果為BufferResponse=false那么數(shù)據(jù)就會(huì)按照16K的字節(jié)塊的模式源源不斷地傳輸給客戶端調(diào)用者;

所以如果WebServices方法返回來(lái)的是比較大的一個(gè)數(shù)據(jù),比如返回來(lái)一個(gè)Dataset,那么用BufferResponse=true可以提高數(shù)據(jù)的傳輸效能。

2 CacheDuration
如果CacheDuration=1000,那么WebService就會(huì)把數(shù)據(jù)緩存在高速緩存中,如果在1000這個(gè)時(shí)間間隔內(nèi)訪問(wèn)同樣的數(shù)據(jù),那么調(diào)用者會(huì)得到一個(gè)緩存數(shù)據(jù),而不是實(shí)時(shí)數(shù)據(jù)。這個(gè)屬性適用于每次查詢(xún)的數(shù)據(jù)沒(méi)有多大變化的情況。

3 EnableSession=true,   
是否保存狀態(tài)信息,本質(zhì)上WebService是一個(gè)SingleCall的模式,不應(yīng)該保存狀態(tài)信息的。在這種模式下,每個(gè)WebMethod的每次調(diào)用都會(huì)生成一個(gè)遠(yuǎn)程對(duì)象,所以說(shuō)每個(gè)遠(yuǎn)程對(duì)象之間是沒(méi)有任何聯(lián)系的所以說(shuō)這種模式下是不能保存狀態(tài)信息的。
但是你如果把EnableSession=true的話,那么你可以在WebService里面使用Session這個(gè)變量來(lái)保存一些狀態(tài)信息(默認(rèn)EnableSession=false)

4 TransactionOption

http://www.microsoft.com/China/Community/program/originalarticles/TechDoc/createWebServicebyVSNET.mspx

http://msdn.microsoft.com/library/cht/default.asp?url=/library/CHT/cpref/html/frlrfsystemwebserviceswebmethodattributeclassenablesessiontopic.asp


分享題目:C#WebService調(diào)用Delphi時(shí)的注意事項(xiàng)
本文來(lái)源:http://m.5511xx.com/article/dhdppjp.html