熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASPX頁Web服務調用性能優化

2013-11-13 10:22:10  來源: .NET編程 

  文介紹了如何通過異步方法消除使用 Microsoft ASPNET 的 Web 服務調用的性能問題和線程池資源的消耗問題
  
  情況從 ASPNET 頁面調用 Web 服務時的性能破壞
  我們在本文中討論 Web 服務時期望在各種情況下都可以享用 Web 服務一個主要的情況是從中間層環境(如 ASPNET Web 頁面)訪問 Web 服務為 MapPoint NET Web 服務的用戶提供支持的人員經常收到這樣的問題即用戶在使用其 Web 服務時對 MapPoint NET 的調用可能需要相當長的時間這本身並不是什麼問題但某些其他因素可以使之成為比表面上要嚴重得多的大問題
  
  HTTP 雙連接限制
  HTTP 規范表明一個 HTTP 客戶端與任一服務器最多可以同時建立兩個 TCP 連接這可以防止單個浏覽器在浏覽某個頁面(例如具有 個嵌入的縮略圖)時由於連接請求過多而使服務器負載過重此時浏覽器將僅創建 個連接然後通過這兩個管道開始發送 個 HTTP 請求而不是創建 個 TCP 連接並通過每個連接來發送 HTTP 請求對於中間層此方法的問題在於中間層可能會有 個同時請求連接的用戶如果不得不為每個用戶進行一次 MapPoint NET Web 服務調用將會有 個用戶等待兩個管道中的一個空閒下來
  
  線程池限制
  ASPNET 處理傳入的請求的方式是通過一個稱為進程線程池的一組線程為其提供服務正常情況下請求傳入後池中某個空閒的線程將為其提供服務這裡的問題在於進程線程池不會創建無數個線程來處理大量的請求具有最大線程數限制是一件好事因為如果我們無限地創建線程計算機上的全部資源將只能用來管理這些線程了通過限制所能創建的線程數我們可以把線程管理的系統開銷保持在一個可控的水平如果某個請求傳入時線程池中的所有線程都被占用則該請求將排隊等候在忙線程完成任務後空閒出來的線程才能處理新請求此方法實際上比切換到某個新線程更有效因為不需要在請求之間進行線程切換但存在的問題是如果線程的使用效率不高(尤其是在非常忙的 Web 服務器上)則等候的請求隊列會變得很大
  
  考慮一下從 ASPNET 頁面進行 Web 服務調用的情況如果進行同步調用則正在運行的線程將被阻塞直到 Web 服務調用完成為止在調用期間線程無法進行任何其他活動它無法處理其他請求只能等待如果某個單處理器計算機上具有默認的工作線程數 則只需 個同時進行的請求即可用完全部線程以後的請求必須排隊等候
  
  該問題不僅限於 Web 服務
  不僅調用 Web 服務的用戶會遇到從 Web 頁面進行調用時的擁堵且耗時較長的問題進行任意數量的較長的調用都會遇到同樣的問題例如SQL Server? 請求長文件的讀取或寫入各種 Web 請求或訪問某個並發資源(其中鎖定會造成嚴重的延遲)實際上有許多使用 Web 服務的情況其服務調用比較迅速並不是什麼問題但您或許會理解如果您想通過代理服務器調用 MapPoint NET Web 服務所使用的連接具有一定的延遲同時相應的服務可能又要花費一些時間來處理請求則您可能在各處位置都看到延遲的情況並且如果站點很忙便可能出現問題
  
  改善問題
  該問題的某些方面可以通過對環境進行某些配置設置來改善我們看一下可用於改善該問題的某些配置設置
  
  maxconnections
  
  連接到 Web 資源的默認雙連接限制可以通過一個名為 connectionManagement 的配置元素來控制connectionManagement 設置允許您添加要讓其采用非默認連接限制的站點的名稱可以將以下內容添加到典型的 nfig 文件中將您連接的所有服務器的連接限制默認值增加到
  
  <configuration>
  <>
  <connectionManagement>
  <add address=* maxconnection= />
  </connectionManagement>
  </>
  
  <systemweb>
  
  
  應當注意的是對本地計算機的連接數量從來都沒有限制因此如果是連接到本地主機則此設置無效
  
  maxWorkerThreads 和 minFreeThreads
  
  如果收到 HTTP 錯誤(服務暫時過載則表明線程池中的線程已全部占用並且請求隊列也已超出最大值(appRequestQueueLimit 的默認設置為 對於 IIS 安裝可以簡單地增加線程池的大小而對於 IIS 安裝(與 IIS 不兼容)這些設置將無效
  
  maxWorkerThreads 和 maxIoThreads 分別控制工作線程數以及處理新提交的 ASPNET 請求的線程數這些設置需要在您的 nfig 中進行配置它們將影響您計算機上運行的所有 Web 應用程序maxWorkerThreads 是 nfig 中的 processModel 元素的一部分並且您在查看後會發現該設置的默認值為每個處理器 個線程
  
  minFreeThreads 設置可以在 nfig 中進行配置或者在您的應用程序的 nfig 文件中的 httpRuntime 元素下進行配置該設置的作用是當空閒的線程數低於所設置的限制時將禁止使用線程池中的線程來處理傳入的 HTTP 請求如果您需要某個進程線程池線程完成掛起的請求這會很有用如果所有的線程都被用來處理傳入的 HTTP 請求並且這些請求在等待另一個線程完成其處理那麼就會進入死鎖狀態例如如果您正在從 ASPNET 應用程序進行對某個 Web 服務的異步 Web 服務調用並且在等待回調函數完成該請求就會出現這種情況因為回調必須在進程線程池中的空閒線程上進行如果查看一下您的 nfig將會注意到 minFreeThreads 設置的默認值為 如果工作線程池的限制為 則該默認值還可以滿足需要但是如果線程池的大小增加到 該默認值就太小了
  
  應當注意的是如果您的 ASPNET 應用程序對本地計算機進行 Web 服務調用則線程池限制的問題將被激化例如我為此專欄創建的測試應用程序調用與 ASPX 頁面同處一台計算機上的 Web 服務因而對於阻塞的調用一個線程被同時用於 ASPX 頁面和 ASMX Web 服務請求這有效地使 Web 服務器處理的同時請求數增加了一倍在同時進行兩個 Web 服務請求(使用異步 Web 服務調用)的情況下我們最終使同時進行的請求數增加了兩倍為避免在回調本地計算機時出現此類問題您應當考慮您的應用程序的體系結構使其簡單地直接從 ASPX 代碼來執行 Web 方法中的代碼
  
  Windows XP 限制
  我們必須要注意如果您在一個 Windows? XP 計算機上進行某項測試則所面臨的另一個限制是 XP Web 服務器對所允許的同時連接數的人為限制因為 Windows XP 不是服務器平台其同時連接數被限制為 這對於開發環境中的測試通常沒問題但是如果試圖進行任何復雜的測試該限制問題就會比較嚴重本地計算機的連接不受此限制影響
  
  真正的解決方案異步請求處理
  調整配置設置是一種改善問題的方法而在實際設計 Web 應用程序時通過某種方式徹底解決問題則是另一回事等待阻塞的調用完成的線程永遠也不會有更好的調整余地因此解決的辦法是完全避免阻塞問題異步處理請求就是一個適當的解決方案這表現在兩個方面進行異步 Web 服務調用以及在 ASPNET Web 應用程序中異步處理請求
  
  異步 Web 服務調用
  在以前的專欄中我寫了有關異步調用 Web 服務的問題能夠使線程不用等待 Web 服務調用完成是創建釋放線程以便處理更多請求的異步頁面處理模型的關鍵部分此外異步調用 Web 服務也比較簡單
  
  請考慮以下 ASPX 頁面的 Visual BasicNET 代碼
  
   錯用同步 Web 服務調用所造成的性能極差的
   頁面!
  Public Class SyncPage
  Inherits SystemWebUIPage
  
  Protected WithEvents Label As SystemWebUIWebControlsLabel
  Protected WithEvents Label As SystemWebUIWebControlsLabel
  
  Private Sub Page_Load(ByVal sender As SystemObject _
  ByVal e As SystemEventArgs) Handles MyBaseLoad
  調用 Web 服務
  Dim proxy As New localhostService
  LabelText = proxyMethod()
  LabelText = proxyMethod()
  End Sub
  
  End Class
  
  此代碼非常易懂頁面加載時將創建一個 Web 服務代理實例然後用該實例兩次調用一個名為 Method 的 Web 方法Method 只返回包含傳遞給該方法的輸入參數的字符串為了向該系統添加一定程度的延遲Method 在返回字符串之前還休眠了 秒鐘從調用返回到 Method 的字符串被放在 ASPX 頁面上的兩個標簽的文本中該頁面提供的性能極差並且像一塊海綿一樣從進程線程池中吸取線程由於在 Method Web 方法中有 秒鐘的延遲對該頁面的一個調用至少要 秒鐘才能完成
  
  以下代碼片段顯示了一個類似 Web 頁面的代碼只不過現在進行的是異步 Web 服務調用
  
  Public Class AsyncPage
  Inherits SystemWebUIPage
  
  Protected WithEvents Label As SystemWebUIWebControlsLabel
  Protected WithEvents Label As SystemWebUIWebControlsLabel
  
  Private Sub Page_Load(ByVal sender As SystemObject _
  ByVal e As SystemEventArgs) Handles MyBaseLoad
  調用 Web 服務
  Dim proxy As New localhostService
  Dim res As IAsyncResult
  = proxyBeginMethod( Nothing Noth
From:http://tw.wingwit.com/Article/program/net/201311/13406.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.