国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

用ASP.NET開發Web服務的五則技巧

2024-07-10 12:58:05
字體:
來源:轉載
供稿:網友
一、禁用http post/get協議

  除非另外指定,否則,.net將試圖把web服務綁定到三種協議:http/post、http/get和soap。之所以說“試圖”,是因為依賴于服務的參數和返回類型,http/get協議可能不可用。.net生成的wsdl文件將自動包含綁定這三種協議的指令,客戶程序可以自由選擇使用哪種協議與服務通信。

  只要在web.config文件中加入下列內容,就可以方便地刪除對http/post和http/get協議的綁定:

<webservices>
<protocols>
<remove name="httppost" />
<remove name="httpget" />
</protocols>
</webservices>



  為什么要避免通過http/post和http/get協議引出web服務呢?主要的兩個原因是安全和互操作性。http/get的安全性不如soap,而且由于http/get常見于web鏈接,懷有惡意的人可能利用它實施欺騙,使別人在不知不覺中用自己的安全標識調用web服務,卻還以為自己在點擊web鏈接。

  就互操作性而言,soap是廣泛應用的web服務通信標準,而http/get和http/post不是。因此,對于.net生成的wsdl文檔中默認包含的http/get和http/post綁定,許多自動生成代理服務器的工具不會理解。因此,如果你的web服務不是非綁定到http/get和http/post協議不可,最好取消這兩種綁定。



二、用tcptrace查看soap請求/應答消息

  對于開發web服務應用的人來說,調試可能是件異乎尋常的難事,因為無論是.net sdk還是vs.net,都沒有提供工具來查看客戶端和服務器之間的soap消息。

  如果.net和非.net的客戶端、服務器端的交互過程出現了問題,要想找出問題的根源,擁有查看soap消息的能力就尤為重要,因為這類問題往往與soap消息的格式有關(例如,“消息中包含了soapaction 嗎?”)。

  tcptrace(www.pocketsoap.com/tcptrace)是一個查看這類消息交換過程的優秀工具,它通過設置一個客戶端和服務器端之間的隧道工作。啟動tcptrace時,它會要求輸入目標url和端口號,以及tcptrace監聽的本地端口號。這樣,你就可以通過設置代理stub的url屬性,把stub指向這個本地端口(例如,localhost:8080)。tcptrace能夠記錄所有的請求和應答http消息。

  tcptrace的一個局限是,它在消息流程中所處的位置決定了它不能用來查看通過ssl發送的消息。如果你要查看通過ssl發送的soap消息,只能編寫一個定制的isapi過濾器。



三、簡化接口設計

  在眾多有關n-層應用設計的論述中,簡化接口設計這一設計要訣可以說是隨處可見。但是,對于web服務這樣的分布式計算環境,簡化接口設計的重要性更加突出。

  在設計分布式應用時,出于性能和可伸縮性的考慮,應當保證客戶端和服務器端之間的調用盡可能地少。減少網絡調用不僅有利于減少通信開銷(如果只用一個soap消息可以達到目標,就絕對不要發三個消息),降低網絡流量,而且提高了應用的性能。顯然,這一切都是開發者夢寐以求的目標。那么簡化的接口到底有何特征呢?

  首先來看一個復雜接口的例子:

namespace chattyservice {
public class chattyservice : webservice {
private string username;
private string password;

public string username {
[webmethod]
set {
username = username;
} }

public string password {
[webmethod]
set {
password = password;
} }

[webmethod]
public bool logon() {
// 驗證身份
return true;
}
}
}



  在這個例子中,username和password是兩個屬性,調用logon()方法之前首先必須設置這兩個屬性。有一個問題光看這段代碼不太容易注意到,這就是username和password都作為web方法引出。這就是說,每次對屬性的get/set操作都會導致一個對服務的調用。

  按照簡化接口設計的要求,改進后的代碼如下:

namespace chattyservice {
public class chattyservice : webservice {
[webmethod]
public bool logon(string username, string password) {
// 驗證身份
return true;
}
}
}



  現在,username和password成了logon()方法的參數。修改之后的代碼的優點在于,它把登錄操作對服務器的三次調用降低到了一次。另一方面,如果參數的個數太多,這個方法可能看起來很不像樣。這時,可能要把方法的參數整理成幾個復雜類型,例如,把username和password兩個參數封裝到一個credential(證書)對象里面。



四、在web.config中保存應用私有的數據

  用asp.net開發的web服務能夠發揮出.aspx應用的所有特長,包括用web.config文件保存應用私有數據的能力(例如,數據庫連接字符串、文件路徑等)。用web.config而不是global.asax文件的好處在于修改配置之后不必重新構造應用。



五、避免使用asp.net會話狀態

  .net實現的會話狀態管理功能解決了它的前輩asp 3.0存在的許多問題,例如請求串行化等,但仍存在一些局限。應當認識到,.net的會話狀態管理功能不是專門為web服務環境中的會話狀態而設計,而是為了在范圍更廣泛的asp.net應用中管理會話狀態而設計,它依賴于http cookie(有一種通過改寫url實現的不需要cookie的模式,但不適用于web服務)。

  cookie是http獨有的。在web上,所有的瀏覽器都支持http,所以cookie非常適合在web應用中使用。但是,在web服務中應用cookie卻把服務限定到了http協議上。另一方面,soap協議的運行是獨立于傳輸協議的,因此如果把web服務應用限制到http協議上,應用的靈活性也受到了限制,一旦要通過非http的傳輸協議(例如smtp)提供服務,事情會變得很麻煩
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 松桃| 台州市| 廉江市| 荥阳市| 新余市| 富锦市| 历史| 奉化市| 依兰县| 维西| 云阳县| 白玉县| 琼中| 龙海市| 六枝特区| 迭部县| 安仁县| 南华县| 民乐县| 手机| 环江| 田阳县| 汉寿县| 沐川县| 萍乡市| 扎囊县| 全南县| 汶川县| 凤台县| 静宁县| 密云县| 安庆市| 三门县| 淄博市| 鄂温| 璧山县| 隆安县| 临海市| 六枝特区| 巩留县| 体育|