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

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

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

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

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

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

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

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

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

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

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

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

C# Web Service調用Delphi時的問題

我們用一個檢驗WebMethod的Attribute的一個簡單的例子進行闡述:它是完成一次從客戶A轉帳到B的一個簡單商務過程。

首先我們在.NET FrameWork1.1下創(chuàng)建一個WebService,這時候.net會幫我們自動創(chuàng)建一個Web應用

我們需要創(chuàng)建一個類AttributeTest,它是在命名空間NameSpace AttributeTesting下的,那么這個類它將自動繼承了它的基類 System.Web.Services.WebService,需要支出的時,我們可以對這個Web應用類設置其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方法,并且對名稱進行重載。
  8. 執(zhí)行的是把錢從A用戶轉帳到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,這也是我們這一次需要講述的重點內容,只要給一個方法加上[WebMethodAttribute],哪怕里面沒有任何屬性,那么WebService就會把這個方法暴露(Expose)給了客戶段調用者.下面我們講述一下它的6個屬性,其中包括2個描述性的信息屬性,4個功能屬性

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

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

下面我把Delphi調用webservice的步驟列舉一下:

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

其次就是你需要設置這個SOAPHTTPClient的屬性URL或者WSDL,這個內容就是你的WebService的服務地址

比如我們當前例子的服務地址是:http://localhost/AttributeTesting/AttributeTesting.asmx

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

這樣就完成了C# Web Service調用Delphi的控件設置;

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

最后你只需要對引入的WSDL的接口進行調用即可。在這里我們的對應代碼是:

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

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

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

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

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

3 EnableSession=true,   
是否保存狀態(tài)信息,本質上WebService是一個SingleCall的模式,不應該保存狀態(tài)信息的。在這種模式下,每個WebMethod的每次調用都會生成一個遠程對象,所以說每個遠程對象之間是沒有任何聯(lián)系的所以說這種模式下是不能保存狀態(tài)信息的。
但是你如果把EnableSession=true的話,那么你可以在WebService里面使用Session這個變量來保存一些狀態(tài)信息(默認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


網(wǎng)站題目:C#WebService調用Delphi時的注意事項
文章網(wǎng)址:http://m.5511xx.com/article/dhdppjp.html