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

首頁 > 編程 > .NET > 正文

.net入門常見問題

2024-07-10 12:59:05
字體:
來源:轉載
供稿:網友
.net framework 系統要求

操作系統要求
下列平臺支持 .net framework。

方案 操作系統
客戶端 microsoft® windows® 98
microsoft® windows® 98 second edition

microsoft® windows® millennium edition

帶有 service pack 6.0a 或更高版本的 microsoft® windows nt® 4.0 workstation

帶有 service pack 6.0a 或更高版本的 microsoft® windows nt® 4.0 server

microsoft® windows® 2000 professional

microsoft® windows® 2000 server

microsoft® windows® 2000 advanced server

microsoft® windows® 2000 datacenter server

microsoft® windows® xp home edition

microsoft® windows® xp professional

microsoft® windows® server 2003 系列

注意 在所有這些系統上,還要求有 microsoft® internet explorer 5.01 或更高版本以及 microsoft® windows® installer 2.0 或更高版本。


服務器 帶有 service pack 2.0 的 microsoft® windows® 2000 professional
帶有 service pack 2.0 的 microsoft® windows® 2000 server

帶有 service pack 2.0 的 microsoft® windows® 2000 advanced server

帶有 service pack 2.0 的 microsoft® windows® 2000 datacenter server

microsoft® windows® xp professional

microsoft® windows® server 2003 系列


附加軟件要求
若要使用附加功能,如 asp.net、com+ 服務和 sql server .net 數據提供程序,需要下列附加軟件。

方案 功能 所需軟件
客戶端 sql server .net 數據提供程序 microsoft 數據訪問組件 (mdac) 2.6 或更高版本
對系統管理信息的訪問 windows management instrumentation (wmi)(在 windows 2000、windows millennium edition 和 windows xp 上隨操作系統一起安裝)
com+ 服務 windows 2000 service pack 2.0
服務器 sql server .net 數據提供程序 microsoft 數據訪問組件 (mdac) 2.7
asp.net microsoft internet 信息服務 (iis) 5.0

硬件要求
方案 所需處理器 推薦的處理器 所需 ram 推薦的 ram
客戶端(windows 窗體和 windows 服務) pentium 90 mhz* pentium 90 mhz 或更快 32 mb* 96 mb 或更高
服務器 pentium 133 mhz* pentium 133 mhz 或更快 128 mb* 256 mb 或更高

*或者操作系統所需的最低要求(二者之中取較高者)。

默認情況下,在已經安裝了 .net framework 的計算機上安裝新的 .net framework 時,所有的 asp.net 應用程序都會自動更新以使用新安裝的 .net framework 版本。唯一的例外是那些綁定到不兼容的運行庫版本或更新的運行庫版本的應用程序。盡管更高版本的 .net framework 具有向后兼容性,您仍可能需要相應地配置 asp.net 應用程序以使用某種舊版本。以下各節描述了針對 .net framework 的特定版本配置 asp.net 應用程序的過程。

查看 asp.net 應用程序的腳本映射

在管理安裝了多個版本的 .net framework 的計算機時,查看 asp.net 應用程序的腳本映射,以確定應用程序所使用的版本,這樣做通常很有用。可以使用 internet 信息服務管理控制臺查看 asp.net 應用程序的腳本映射。

查看 asp.net 應用程序的腳本映射

打開 iis 管理控制臺,單擊加號展開本地計算機,然后定位到包含 asp.net 應用程序的文件夾。
右擊文件夾,再單擊“屬性”。出現應用程序的“屬性”對話框。
單擊“目錄”選項卡中的“配置”按鈕。出現“應用程序配置”對話框。
在“映射”選項卡中,選擇 asp.net 應用程序擴展名,如 .asmx 或 .aspx。
對話框的“可執行文件路徑”列列出了到應用程序所使用的 asp.net isapi 版本的路徑。默認情況下,asp.net isapi 被安裝在以下位置:

系統根/microsoft.net/framework/版本號

路徑中顯示的版本號說明了應用程序所使用的 asp.net isapi 的版本號。asp.net isapi 版本確定了應用程序所使用的運行庫版本。

使用 aspnet_regiis.exe 更新腳本映射

為使重新配置 asp.net 應用程序的腳本映射更容易,每個 .net framework 安裝都提供了一個關聯的 asp.net iis 注冊工具 (aspnet_regiis.exe) 版本。管理員可以使用此工具將 asp.net 應用程序重新映射到與此工具關聯的 asp.net isapi 版本。

注意 因為 aspnet_regiis.exe 鏈接到特定版本的 .net framework,管理員必須使用適當版本的 aspnet_regiis.exe,以針對 asp.net 應用程序重新配置腳本映射。aspnet_regiis.exe 僅將 asp.net 應用程序的腳本映射重新配置為與此工具關聯的 asp.net isapi 版本。
此工具也可用來顯示所有已安裝的 asp.net 版本的狀態、注冊關聯的 asp.net 版本、創建客戶端腳本目錄以及執行其他配置操作。

使用 aspnet_regiis.exe 更新某一 asp.net 應用程序的腳本映射

1 打開命令窗口。(單擊“開始”,單擊“運行”,鍵入“cmd”,然后單擊“確定”。)
2 定位到要使用的 aspnet_regiis.exe 版本的目錄。記住每一版本的 .net framework 都有自己的版本。文件通常位于以下目錄:
系統根/microsoft.net/framework/版本號

3 與到應用程序的路徑一起使用 aspnet_regiis.exe 的 -s 或 -sn 選項,以設置腳本映射。以下顯示了一個命令行示例,它更新一個名為 sampleapp1 的應用程序的腳本映射。
aspnet_regiis.exe -s w3svc/1/root/sampleapp1
禁用腳本映射自動更新

為防止將全部現有應用程序自動重新映射到正在安裝的 .net framework 版本,請在運行 dotnetfx.exe 安裝程序時使用 /noaspupgrade 命令行選項。以下顯示了整個命令行。

dotnetfx.exe /c:"install /noaspupgrade"

卸載某一版本的 asp.net

如果您在一臺計算機上安裝了多個版本的 asp.net,您可以單獨卸載某一版本。卸載 asp.net 通常采用的方式是:通過“控制面板”中的“添加或刪除程序”項卸載 .net framework。在卸載過程中,安裝程序使用 -u 選項(卸載標志)來調用 asp.net iis 注冊工具 (aspnet_regiis.exe)。

注意 如果只是希望卸載某一版本的 asp.net,而不卸載關聯的 .net framework,可以直接使用 aspnet_regiis.exe。.net framework 的每一份安裝都包含該工具的關聯版本。如果只卸載 asp.net,請使用與要卸載的 asp.net 版本相關聯的工具版本的 -u 選項。有關更多信息,請參見 asp.net iis 注冊工具 (aspnet_regiis.exe)。
aspnet_regiis.exe 的 -u 選項執行以下操作:

當前映射到要卸載的 asp.net 版本的所有 asp.net 應用程序將被重新映射到計算機上的次最新兼容版本。如果不存在相兼容版本,該應用程序的腳本映射將被完全刪除。
警告 刪除腳本映射后,iis 將以文本形式提交 asp.net 頁。這有可能會將源代碼公開給客戶端。
asp.net 狀態服務為 asp.net 的所有兼容版本所共享,并且總是映射到安裝的最新版本的 asp.net。如果您要卸載的 asp.net 版本正是當前的最新版本,計算機上的下一個兼容的最高版本就會被注冊,以取代這一版本。如果不存在兼容版本,asp.net 狀態服務將被卸載。
特定于要卸載的版本的性能對象及關聯的性能計數器將被刪除。適用于所安裝的所有 asp.net、asp.net 和 asp.net 應用程序版本的一般性性能對象和計數器將定向到計算機上剩下的最新安裝版本。
aspnet 用戶帳戶為 asp.net 的所有兼容版本所共享。如果計算機上已不存在其他的 asp.net 安裝,aspnet 用戶帳戶以及關聯的訪問控制列表將被刪除。

asp.net 應用程序的腳本映射

如果在同一計算機上安裝了多個版本的 .net framework,則這些安裝各包含一個關聯的 asp.net isapi 版本。asp.net 應用程序使用 asp.net isapi 確定該應用程序使用哪一版本的 .net framework。asp.net 應用程序可以配置為使用所安裝的 asp.net isapi 的任一版本。若要指定 asp.net 應用程序所使用的 asp.net isapi 版本,應在 internet 信息服務 (iis) 中為該應用程序注冊腳本映射。

腳本映射將文件擴展名和 http 謂詞與適當的 isapi 相關聯,以便實現腳本處理。例如,如果 iis 接收到對某一 .aspx 文件的請求,該應用程序的腳本映射就會指示 iis 將所請求的文件發送給適當版本的 asp.net isapi 來處理。每一 asp.net 應用程序的腳本映射通常是在 internet 信息服務管理控制臺中設置的,可以直接應用到某一應用程序,也可以從父應用程序繼承。默認情況下,安裝了 .net framework 之后,會自動更新計算機上所有現有 asp.net 應用程序的腳本映射以使用與這一安裝相關聯的 asp.net isapi 版本,除非應用程序使用更高的版本或者不兼容的版本。

為使重新配置 asp.net 應用程序的腳本映射更容易,每個 .net framework 安裝都提供了一個關聯的 asp.net iis 注冊工具 (aspnet_regiis.exe) 版本。默認情況下,該工具安裝在以下目錄:

<系統根>/microsoft.net/framework/〈版本號〉

管理員可以使用此工具將 asp.net 應用程序重新映射到與此工具關聯的 asp.net isapi 版本。

注意 因為 aspnet_regiis.exe 與特定版本的 .net framework 相關聯,管理員必須使用適當版本的 aspnet_regiis.exe,為 asp.net 應用程序重新配置腳本映射。aspnet_regiis.exe 僅將 asp.net 應用程序的腳本映射重新配置為與此工具關聯的 asp.net isapi 版本。
此工具也可用來顯示所有已安裝的 asp.net 版本的狀態、注冊關聯的 asp.net 版本、創建客戶端腳本目錄以及執行其他配置操作。

在 windows server 2003 系列產品上,在 iis 管理器中啟用 asp.net

使用“配置您的服務器向導”,在運行 windows server 2003 的服務器上安裝 asp.net

在任務欄上,單擊“開始”按鈕,然后單擊“管理您的服務器”,在“管理您的服務器”窗口中單擊“添加或移除角色”。
在“配置您的服務器向導”中,單擊“下一步”,在“服務器角色”對話框中選中“應用程序服務器 (iis, asp.net)”,然后單擊“下一步”。
在“應用程序服務器選項”對話框中,單擊“啟用 asp.net”復選框,單擊“下一步”,再單擊“下一步”。
如有必要,在 cd-rom 驅動器中插入 windows server 2003 安裝 cd,然后單擊“下一步”。
安裝完成后,單擊“完成”。
使用“添加/刪除程序”對話框,在運行 windows server 2003 的服務器上安裝 asp.net

在任務欄上,單擊“開始”按鈕,指向“控制面板”,然后單擊“添加或刪除程序”。
在“添加/刪除程序”對話框中,單擊“添加/刪除 windows 組件”。
在“windows 組件向導”的“組件”框中,單擊“應用程序服務器”復選框,然后單擊“下一步”。
當“windows 組件向導”配置完 windows server 2003 后,單擊“完成”。
在 windows server 2003 系列產品上,在 iis 管理器中啟用 asp.net

在任務欄上單擊“開始”按鈕,然后單擊“運行”。
在“運行”對話框的“打開”框中,輸入“inetmgr”,然后單擊“確定”。
在“iis 管理器”中,展開“本地計算機”,然后單擊“web 服務擴展”。
在右窗格中,右擊“asp.net”,然后單擊“允許”。asp.net 的狀態隨即更改為“允許”。
當在運行 windows xp professional 或 windows 2000 server 的計算機上安裝 visual studio .net 時,.net framework 和 asp.net 也會自動安裝。如果要單獨安裝 asp.net 和 .net framework,可以從網上下載它們并安裝到您的服務器上。下面的過程提供了具體的步驟。

在運行 windows xp professional 或 windows 2000 server 的計算機上下載和安裝 asp.net

如有必要,安裝并啟動 iis。有關安裝說明,請參見操作系統的文檔。
在 msdn.microsoft.com/downloads/default.asp 上,展開“software development kits”(軟件開發工具包),單擊“microsoft .net framework sdk”,然后閱讀頁面上有關下載 sdk 的要求、說明和選項。
單擊所需的下載選項,閱讀最終用戶許可協議,然后單擊“yes”(是)。
在“文件下載”對話框中,選擇保存下載文件,選擇要將安裝程序和自述文件下載到的文件夾,然后單擊“保存”。
查看自述文件中任何最新的說明。
在下載文件所在的文件夾中,雙擊 .net framework 安裝程序 setup.exe。
如果您已經安裝并啟用了 iis,安裝了 asp.net 和 .net framework,部署了應用程序并請求了一個頁,但是收到以下錯誤信息之一,這說明還沒有為 web 站點或虛擬目錄設置適當的權限:

對“c:/inetpub/wwwroot”目錄的訪問被拒絕。未能開始監視目錄更改。
服務器無法訪問應用程序目錄“c:/inetpub/wwwroot/<虛擬目錄名>/”。該目錄不存在或者因安全設置而無法訪問。
在根 web 站點或任何虛擬目錄上,asp.net 需要 aspnet 帳戶(aspnet_wp.exe 進程帳戶)的讀取、執行和列出權限。必須有這些設置,asp.net 才能訪問內容文件和監視文件更改。請執行下面的步驟更正此問題。

在根 web 站點或虛擬目錄上添加 aspnet 帳戶的讀取、執行和列出權限

在 windows 資源管理器中,瀏覽到包含根 web 站點(默認設置為:c:/inetpub/wwwroot)或虛擬目錄的文件夾。
右擊該文件夾,然后單擊“屬性”。
在“安全”選項卡上,單擊“添加”。
輸入 computername /aspnet(例如,在名為 webdev 的計算機上輸入 webdev/aspnet),然后單擊“確定”。
允許 aspnet 帳戶的下列權限:讀取并執行、列出文件夾內容、讀取。
單擊“確定”關閉“屬性”對話框并保存更改。
注意 如果“everyone”(每個人)組或“用戶”組能夠讀取根 web 站點或虛擬目錄,則不需要執行這些步驟。

使用 iis 創建 asp.net web 應用程序根目錄

本演練步驟向您說明如何使用 internet 信息服務 (iis) 將某個目錄標記為應用程序根目錄。此演練說明如何創建虛擬目錄并將 c:/inetpub/wwwroot 目錄設置為應用程序的根目錄。

準備此次演練

創建一個新目錄。此演練使用 c:/mywebapp 目錄。
接下來,為 iis 打開 microsoft 管理控制臺 (mmc),并使用下列過程之一創建一個虛擬目錄。

使用 windows server 2003 系列產品創建虛擬目錄

單擊“開始”,指向“管理工具”,然后單擊“internet 信息服務”。
展開“本地計算機”節點(這可能由您的計算機名稱表示),展開“網站”,然后單擊“默認網站”。
在“操作”菜單上單擊“新建”,然后單擊“虛擬目錄”。
在“虛擬目錄創建向導”中,單擊“下一步”。
在“別名”文本框中輸入您的應用程序名稱,然后單擊“下一步”。
輸入為準備此演練而創建的物理目錄 c:/mywebapp,然后單擊“下一步”。
在“訪問權限”頁中,選中您的應用程序所需的訪問權限,然后單擊“下一步”。
單擊“完成”。
使用 windows xp 創建虛擬目錄

單擊“開始”,然后單擊“控制面板”。
如果尚未完成以上操作,單擊“切換到傳統型視圖”。
雙擊“管理工具”,然后單擊“internet 信息服務”。
展開“本地計算機”節點(這可能由您的計算機名稱表示),展開“web 站點”,然后單擊“默認 web 站點”。
在“操作”菜單上單擊“新建”,然后單擊“虛擬目錄”。
在“虛擬目錄創建向導”中,單擊“下一步”。
在“別名”文本框中輸入您的應用程序名稱,然后單擊“下一步”。
輸入為準備此演練而創建的物理目錄 c:/mywebapp,然后單擊“下一步”。
在“訪問權限”頁中,選中您的應用程序所需的訪問權限,然后單擊“下一步”。
單擊“完成”。
使用 windows 2000 創建虛擬目錄

單擊“開始”,指向“程序”,指向“管理工具”,然后單擊“internet 服務管理器”。
展開“本地計算機”節點(這可能由您的計算機名稱表示),展開“web 站點”,然后單擊“默認 web 站點”。
在“操作”菜單上單擊“新建”,然后單擊“虛擬目錄”。
在“虛擬目錄創建向導”中,單擊“下一步”。
在“別名”文本框中輸入您的應用程序名稱,然后單擊“下一步”。
輸入為準備此演練而創建的物理目錄 c:/mywebapp,然后單擊“下一步”。
在“訪問權限”頁中,選中您的應用程序所需的訪問權限,然后單擊“下一步”。
單擊“完成”。
也可以在 inetpub/wwwroot 中的現有目錄下創建應用程序根目錄。為準備此演練,請在目錄 c:/inetpub/wwwroot 下創建一個目錄。如前所述,將其命名為 mywebapp。

使用 iis 將 inetpub/wwwroot 中的現有目錄標記為 web 應用程序

將 mmc 打開到“默認 web 站點”,過程同前。
在“默認 web 站點”中,單擊要指定為應用程序根目錄的子目錄。在本例中,為 mywebapp。
右擊要作為應用程序根目錄的目錄,然后單擊“屬性”。
在“虛擬目錄”選項卡的“應用程序設置”節中,單擊“創建”。
在“應用程序名”文本框中,輸入應用程序的名稱,然后單擊“確定”。

asp.net 配置文件相關

可擴展的基礎結構是 asp.net 配置系統的一大特色,該基礎結構使您可以在最初部署 asp.net 應用程序時定義配置設置,以便可以隨時添加或修改這些配置設置,同時對運作著的 web 應用程序和服務器產生的影響也將被減至最小。

asp.net 配置系統提供以下好處:

配置信息存儲在基于 xml 的文本文件中。您可以使用任何標準的文本編輯器或 xml 分析器來創建和編輯 asp.net 配置文件。
多個配置文件(名稱都是 web.config)可以出現在 asp.net web 應用程序服務器上的多個目錄中。每個 web.config 文件都將配置設置應用于它自己的目錄和它下面的所有子目錄。子目錄中的配置文件可以提供除從父目錄繼承的配置信息以外的配置信息,子目錄配置設置可以重寫或修改父目錄中定義的設置。名為 systemroot/microsoft.net/framework/versionnumber/config/machine.config 的根配置文件提供整個 web 服務器的 asp.net 配置設置。
在運行時,asp.net 使用分層虛擬目錄結構中 web.config 文件提供的配置信息為每個唯一的 url 資源計算一組配置設置。然后緩存結果配置設置,以供所有后面的對資源的請求使用。請注意,繼承是由傳入請求路徑 (url) 定義的,而不是到磁盤上資源的文件系統路徑(物理路徑)定義的。
asp.net 檢測對配置文件的更改并自動將新配置設置應用于受該更改影響的 web 資源。不需要重新啟動服務器讓更改生效。只要層次結構中的配置文件被更改,就將自動重新計算并重新緩存分層配置設置。 節例外。
asp.net 配置系統是可以擴展的。您可以定義新配置參數并編寫配置節處理程序以對它們進行處理。
asp.net 通過配置 internet 信息服務 (iis) 防止對配置文件的直接瀏覽器訪問來保護配置文件不受外部訪問。向任何試圖直接請求配置文件的瀏覽器返回 http 訪問錯誤 403(禁止)。

asp.net 資源的配置信息包含在一組配置文件中,每個文件都名為 web.config。每個配置文件都包含 xml 標記和子標記的嵌套層次結構,這些標記帶有指定配置設置的屬性。因為這些標記必須是格式正確的 xml,所以標記、子標記和屬性是區分大小寫的。標記名和屬性名是 camel 大小寫形式的,這意味著標記名的第一個字符是小寫的,任何后面連接單詞的第一個字母是大寫的。屬性值是 pascal 大小寫形式的,這意味著第一個字符是大寫的,任何后面連接單詞的第一個字母也是大寫的。true 和 false 例外,它們總是小寫的。

所有配置信息都駐留在 和 根 xml 標記之間。標記間的配置信息分為兩個主區域:配置節處理程序聲明區域和配置節設置區域。

配置節處理程序聲明出現在配置文件頂部 和 標記之間。包含在 標記中的每個聲明都指定提供特定配置數據集的節的名稱和處理該節中配置數據的 .net framework 類的名稱。

配置節設置區域位于 區域之后,它包含實際的配置設置。 區域中的每個聲明都有一個配置節。每個配置節都包含子標記,這些子標記帶有包含該節設置的屬性。

下面的 web.config 文件示例聲明兩個配置 處理程序。一個管理應用程序設置,另一個管理會話狀態。



type="system.configuration.namevaluefilesectionhandler,
system, version=1.0.3300.0,
culture=neutral, publickeytoken=b77a5c561934e089"/>
type="system.web.sessionstate.sessionstatesectionhandler,
system.web, version=1.0.3300.0, culture=neutral,
publickeytoken=b03f5f7f11d50a3a"
allowdefinition="machinetoapplication"/>









您只需要聲明配置節處理程序一次。您可以將其放置在服務器的根 machine.config 文件中或包含 web 應用程序文件的虛擬目錄的 web.config 文件中。子目錄中的配置文件自動繼承父目錄中聲明的配置處理程序。有關更多信息,請參見配置繼承。

配置設置在節分組標記下經常嵌套在一起。這些頂級節標記通常表示配置設置應用到的命名空間。例如,頂級 標記表示網絡類的設置, 標記表示 asp.net 類的設置。

配置 設置

通過使用具有適當的 path 屬性的 標記,可以將配置設置應用于特定的資源。path 屬性可用于標識對其應用唯一配置設置的特定的文件或子目錄。
例如,下面的配置文件在三個級別指定設置:
應用于當前目錄和所有子目錄的設置(全部內容包含在頂部 標記中)。
應用于 sub1 子目錄的設置(全部內容包含在 標記中,路徑屬性設置為 sub1)。
應用于 sub2 子目錄的設置(全部內容包含在 標記中,路徑屬性設置為 sub2)。



























訪問 asp.net 配置設置

您可以從 asp.net 應用程序使用 asp.net 公開的內部靜態方法來訪問公共配置設置。例如,若要讀取 節 cookieless 屬性的值,您可以使用下面的代碼行。
[visual basic]
dim nocookies as boolean = session.iscookieless
[c#]
bool nocookies = session.iscookieless;
可以使用 configurationsettings.appsettings 靜態字符串集合來訪問 web.config 文件頂級 節中存儲的應用程序特定的設置。例如:
[visual basic]
dim dsn as string = configurationsettings.appsettings("dsn")
[c#]
string dsn = configurationsettings.appsettings["dsn"];


創建新的配置節

您可以用自己的 xml 配置標記擴展標準的 asp.net 配置設置集。若要完成該操作,您必須創建自己的配置節處理程序。該處理程序必須是一個實現 iconfigurationsectionhandler 接口的 .net framework 類。節處理程序解釋并處理 web.config 文件特定部分中 xml 標記中定義的設置并根據配置設置返回適當的配置對象。處理程序類返回的配置對象可以是任何數據結構;它不限于任何基配置類或配置格式。
下面的示例定義 iconfigurationsectionhandler 接口。
[visual basic]
namespace system.web.configuration
public interface iconfigurationsectionhandler
function create(parent as object, input as object, _
node as xmlnode) as object
end interface
end namespace
[c#]
namespace system.web.configuration
{
public interface iconfigurationsectionhandler
{
public object create(object parent, object input,
xmlnode node);
}
}
您還可以定義自己的節,該節與 節使用相同的配置處理程序。例如:




"system.configuration.namevaluesectionhandler,system"/>













您可以讀取上面的示例中定義的新配置節的值,如下:
[visual basic]
dim config as namevaluecollection =
configurationsettings.getconfig("mygroup/nestedgroup/mysection")
response.write("the value of key_one is " & config("key_one") & "
")
response.write("the value of key_two is " & config("key_two") & "
")
[c#]
namevaluecollection config = (namevaluecollection)
configurationsettings.getconfig("mygroup/nestedgroup/mysection");
response.write("the value of key_one is " + config["key_one"] + "
");
response.write("the value of key_two is " + config["key_two"] + "
");
部署 asp.net web 應用程序

部署 asp.net 應用程序非常簡單。只需將所創建的應用程序文件從開發計算機復制到將承載應用程序的成品 web 服務器。可以使用 xcopy 命令行工具或喜歡的 ftp 應用程序,將文件從一個位置復制到另一個位置。

要部署希望在 web 應用程序間共享的程序集(比如包含自定義 asp.net 服務器控件的程序集),應將其部署到全局程序集緩存。

全局程序集緩存我在這里簡單介紹一下:



安裝有公共語言運行庫的每臺計算機都具有稱為全局程序集緩存的計算機范圍內的代碼緩存。全局程序集緩存中存儲了專門指定給由計算機中若干應用程序共享的程序集。

應當僅在需要時才將程序集安裝到全局程序集緩存中以進行共享。一般原則是:程序集依賴項保持專用,并在應用程序目錄中定位程序集,除非明確要求共享程序集。另外,不必為了使 com interop 或非托管代碼可以訪問程序集而將程序集安裝到全局程序集緩存。

注意 在有些情況下,您顯然不希望將程序集安裝到全局程序集緩存中。如果您將組成應用程序的某個程序集置于全局程序集緩存中,則將不再能夠通過使用 xcopy 命令復制應用程序目錄來復制或安裝該應用程序。您還必須在全局程序集緩存中移動該程序集。
有若干方法可以將程序集部署到全局程序集緩存中:

使用專用于全局程序集緩存的安裝程序。該方法是將程序集安裝到全局程序集緩存的首選方法。
使用 .net framework sdk 所提供的名為全局程序集緩存工具 (gacutil.exe) 全局程序集緩存工具使您可以查看和操作全局程序集緩存和下載緩存的內容。gacutil [options] [assemblyname | assemblypath | assemblylistfile]的開發人員工具。
使用 windows 資源管理器將程序集拖到緩存中。



從命令行部署 asp.net 應用程序

單擊“開始”,然后單擊“運行”。
在“運行”對話框的“打開”文本框中,輸入“cmd”,然后單擊“確定”。
在命令提示處,鍵入下列命令:
xcopy <源路徑> <目標路徑>

在此命令中,<源路徑> 是需要復制的源文件的完整路徑,包括驅動器、目錄和要復制的文件名。如果目錄下的全部文件都需要復制,可以省略文件名。<目標路徑> 是文件應該復制到的目錄的完整路徑。

以下的命令示例將 c:/mywebapp 目錄下的所有文件復制到 d:/liveapp 目錄下。

xcopy c:/devapp d:/liveapp
回答所有關于所復制的文件或目錄的問題。
當需要更新應用程序的 /bin 目錄下存儲的 dll 或更新任何其他應用程序文件時,都可以使用此過程。下面的示例將一個驅動器的 /bin 目錄中的一個 dll 復制到另一個驅動器的 /bin 目錄下。

xcopy c:/devapp/bin/myassembly.dll d:/liveapp/bin/
同樣,一旦部署了應用程序,就可以使用此命令更新應用程序中的文件。雖然可以復制整個目錄,但是在復制個別文件時,在兩個目錄之間一次只能復制一個文件。可以使用 xcopy /exclude 選項,從復制中排除子目錄、帶指定文件擴展名的文件或具體的文件名。有關如何使用 xcopy 工具的更多信息,請打開操作系統的文檔并搜索 xcopy。

注意 對于 xcopy 工具必須使用物理目錄名。不能使用虛擬目錄名。

visual studio 中設計時的 web 應用程序安全性

當您在 visual studio 中工作以創建 web 應用程序時,將需要在開發過程中訪問一些資源,與這種訪問相關的安全性存在一些特定的要求。這些要求不同于那些適用于應用程序用戶的要求。設計時的安全性要求包括:

訪問您的工作服務器、數據庫服務器以及其他屬于應用程序一部分的資源。
您選擇了哪種 web 訪問方法(您如何向 web 服務器傳輸數據)。
以完全受信任模式運行代碼。
調試。
部署您的應用程序。
訪問開發資源
為了在 visual studio 中創建和測試 web 應用程序,您必須能夠訪問運行 internet 信息服務 (iis) 的計算機。在此服務器(即開發服務器,它不同于您在其中部署應用程序的生產服務器)上,必須具有某些最低程度的特權,其中包括能夠將文件寫入服務器并運行這些文件。

web 服務器不必位于用于開發的同一臺計算機上。但是,您必須至少在 web 服務器上安裝 visual studio 的服務器組件,以使其支持應用程序的調試和部署。

對資源的設計時訪問通常使用 windows nt 身份驗證來處理,也就是說,作為開發人員,您使用自己的網絡登錄憑據來獲取對所需資源的訪問權。當 visual studio 安裝完畢后,它會在服務器上創建一個名為“vs developers”(vs 開發人員)的組。該組具有在此計算機上開發 web 項目所必需的全部文件、共享和 iis 權限。(計算機管理員可以進一步為該組配置自定義權限,但這并不是必需的。)作為開發人員,您必須作為個人或您所屬的另一個組的成員成為該組的成員。授予“vs developers”(vs 開發人員)組的特定權限有:

訪問 web 服務器計算機的 wwwroot 目錄的權限。
創建、修改和執行 web 目錄中文件的權限。
調試遠程 web 應用程序的權限。
安全說明 開發人員并不需要為使用某服務器進行開發而具有該服務器的管理員權限。(但是,所有開發人員都必須是“vs developers”(vs 開發人員)組的成員。)如果向開發人員授予不必要的管理員權限,則可能會給網絡造成安全性風險。
如果您的應用程序需要訪問進一步的資源,您必須同樣地作為個人或作為組的成員建立對這些資源的訪問權限。一個典型的示例就是 sql server。作為 web 應用程序開發人員,您將需要能夠讀取(并在可能時更新)應用程序所需的數據庫表。對于某些方案,您還需要具有將存儲過程寫入服務器的權限;在其他方案中,則可能需要具有添加、改變或刪除表的權限。

web 訪問方法
visual studio 允許您以兩種方式訪問 web 應用程序項目:

使用文件共享訪問(unc 訪問)。在這種方式中,visual studio 使用基于 windows 的文件管理命令將文件復制到服務器上。
使用 frontpage 服務器擴展訪問。在這種方式中,將使用 http 來傳輸文件。
文件共享訪問要求您與 web 服務器位于同一域中。實際上,這意味著您只能在自己的網絡上使用文件共享訪問。

對比之下,frontpage 訪問允許跨越防火墻創建和管理應用程序(只要防火墻傳遞 http 請求)。這樣,就可以通過 internet 執行操作(當然也可以在您首選 http 訪問的本地設置中執行操作)。

這兩種訪問方法仍然要求使用 visual studio 服務器組件、“vs developers”(vs 開發人員)組等正確配置服務器。同樣,您仍然需要在服務器上具有足夠的特權才能創建、編寫和運行文件。


以完全受信任模式運行代碼
當 visual studio 運行時,設計器在設計時運行的用戶代碼將始終以完全受信任模式運行。即使該代碼最終部署到的環境將以限制較大的安全性來運行,情況也是如此。這包括兩層含義:

可能會因為將不安全代碼導入項目而給本地計算機帶來安全性風險。由于 visual studio 以完全受信任模式運行,導入的代碼會從 visual studio 繼承其權限,而不安全的代碼將作為安全代碼來運行。只有在惡意用戶創建具有破壞性的代碼段(例如自定義控件),而您隨后因疏忽導入并運行該代碼段的情況下,才需要注意這一問題。因此,在將代碼導入項目時,務必要加倍小心。
您在 visual studio 中創建的應用程序可能會在部署后無法正確運行,因為該代碼是在不同的安全性上下文中運行。

調試
調試要求您能夠附加到在本地計算機(如果 web 服務器位于另一臺計算機上,則為遠程計算機)上運行的進程。調試要求您使用“管理員”特權運行。如果您是在遠程計算機上進行調試,則必須在本地計算機上和遠程計算機上都具有相應的權限。

當 visual studio 安裝完畢后,它將創建一個名為“debugger users”(調試器用戶)的組,該組具有進行調試所必需的權限。通過將開發人員和調試用戶劃分到不同的組,服務器管理員可以向一個經過精選的組授予調試所必需的特權,而不是向所有使用 visual studio 的用戶授予這些特權。

安全說明 “debugger users”組中的成員可有效地授予用戶管理級別特權。不要使不應具有這種級別特權的任何人成為此組的成員。

部署應用程序
當完成應用程序后,您必須能夠將它部署到生產服務器。如果生產服務器不屬于您,則對該服務器的訪問可能會受到很多在您的開發服務器上沒有的限制。

部署 web 應用程序的一種方法是使用 visual studio 部署工具。這種部署允許您執行應用程序的完全安裝(包括注冊和配置)。但是,它要求您對承載 web 服務器的計算機具有管理員權限。

此外,如果生產服務器上安裝有 frontpage 服務器擴展,您也可以選擇通過 http 使用 copy project 命令來進行部署。這種部署為您提供的部署功能較少,但卻允許您跨越防火墻進行部署。為了將文件寫入目標服務器,您仍然必須在該服務器上具有足夠的特權。
運行時的 web 應用程序安全性

身份驗證


asp.net 支持通過以下方法對用戶進行身份驗證。其中幾種方法與 iis 身份驗證相重疊。有關詳細信息,請參見介紹 web 應用程序安全性。

身份驗證類型 說明
匿名訪問 用于未知用戶將在其中發出請求的應用程序(通常是公共 web 應用程序)。與 iis 重疊。
基本和簡要身份驗證 (與 iis 重疊)在此方案中,將提示無憑據的用戶提供用戶名和密碼。
windows 集成安全性 (ntlm) (與 iis 重疊)如果發出請求的用戶已經在基于 windows 的網絡中進行了身份驗證,則在請求對資源的訪問時,iis 就可以通過該用戶的憑據。
證書身份驗證 (與 iis 重疊)在此方案中,客戶端具有已從第三方來源獲取的證書(數字標識)。該證書通過請求傳遞到您的應用程序。
kerberos (與 iis 重疊)kerberos 身份驗證協議定義客戶端與稱作密鑰分發中心 (key distribution center, kdc) 的網絡身份驗證服務之間的交互。windows 2000 在每個域控制器上以身份驗證服務的形式來實現一個 kdc。有關詳細信息,請參見 kerberos 協議的基本概念。
forms 身份驗證 如果需要對某用戶進行身份驗證,asp.net 則會將請求重定向到您指定的頁。該頁通常包含一個您要在其中獲取用戶名信息的窗體。(如需額外的安全性,可以使用 https 協議交換該窗體。)當應用程序獲取窗體信息時,它可以對用戶的憑據執行應用程序特定的檢查。值得注意的是,身份驗證進程在您的控制之下(與 iis 不同),這使您能夠指定窗體的外觀并選擇存儲用戶信息的方式。
如果某用戶成功通過身份驗證,asp.net 將頒發一個包含特定標記的加密 cookie,該標記將為后繼的訪問標識該用戶。

passport 身份驗證 利用 asp.net,您可以檢查那些具有從符合 microsoft passport 的應用程序中獲取的憑據的用戶。
如果某用戶成功通過身份驗證,asp.net 將頒發一個包含特定標記的加密 cookie,該標記將為后繼的訪問標識該用戶。


在 asp.net 應用程序中,forms 身份驗證通常是最佳的選擇,因此它使您能夠在很大程度上控制如何對用戶進行身份驗證并允許您將身份驗證存儲在一個標記中。

xml web services 安全性
xml web services 使用 asp.net 并作為 web 應用程序來運行,因此它們所參與的安全性模型與任何 asp.net 應用程序所參與的安全性模型都相同。例如,xml web services 可能配置為使用基本身份驗證或 windows 集成安全性。

在設計時,當您嘗試向 xml web services 添加引用(即請求 xml web services 的發現文檔)時,該 xml web services 將按照它的配置來執行標準的 web 應用程序身份驗證。例如,如果 xml web services 配置為使用基本身份驗證,該服務將需要從發出請求的客戶端獲取用戶名和密碼。在 visual studio 中,通常使用添加 web 引用對話框來發現 xml web services。例如,如果 xml web services 使用的是基本身份驗證,“添加 web 引用”對話框將提示您提供憑據。

如果您正在生成的應用程序包含對 xml web services 的調用,則需要確保在進行調用之前具有正確的憑據,否則該調用將會失敗。在運行時,可以通過在調用 xml web services 的方法之前設置表示 xml web services 的客戶端對象的 credentials 屬性來向 xml web services 傳遞憑據。

由于其他 asp.net 安全性選項可能不夠靈活,xml web services 可以實現一種憑據信息在 soap 標頭中進行傳遞的自定義身份驗證解決方案。在該解決方案中,憑據在客戶端和服務器之間交換的消息的可選部分進行傳遞。然后可以編寫一個自定義的 httpmodule(實現 ihttpmodule 接口),它可以偵聽標頭中的信息并調用您的身份驗證代碼。

與其他 asp.net 應用程序相同,xml web services 可能會實現基于特定角色的授權,以限制對應用程序特定部分的訪問。

建立 ssl 和加密
若要使用 ssl 和加密,必須獲取您所在公司或標識的服務器證書。證書是一種數字簽名,它標識您的站點,使其無法被模擬。對于 internet(公共)應用程序,可以從公認的第三方證書頒發機構獲取服務器證書。對于私有 (intranet) 應用程序,您自己就可以頒發服務器證書。您這樣做的目的可能是為了確保內部應用程序(如個人站點)的安全。

服務器證書還使您能夠使用加密。ssl 使用一種稱作“公鑰加密”(public key encryption) 的加密方法。這種形式的加密機制中有兩個密鑰:公鑰用于對數據進行加密;私鑰由您密存,用于對用公鑰加密的信息進行解密。您所獲取的服務器證書包含一個公鑰。當用戶需要使用 ssl 時,您的應用程序將向瀏覽器發送證書和公鑰。然后,瀏覽器和服務器使用公鑰來建立一種對它們的信息交換進行加密的方式。

注意 若要使用 ssl,瀏覽器必須支持長度至少為 40 位的加密。大多數瀏覽器都提供這種級別的加密。
當獲取服務器證書后,可以指示用戶將 https:// 用作前綴來獲取和發送 web 頁,以使用 ssl。iis 和瀏覽器將自動使用加密信道來交換信息。

web 應用程序的基本安全實施策略


常規 web 應用程序安全性建議


有些最基本的安全性建議也是最顯然易見的。但是,如果惡意用戶可以使用簡單方法進入您的計算機,即使是最精心設計的應用程序安全性也會失敗。

經常進行備份,并將備份存放在安全的場所。
將您的 web 服務器計算機放置在安全的場所,這樣,未經授權的用戶就無法使用它、關閉它、帶走它,等等。
使用 windows ntfs 文件系統,不使用 fat32。ntfs 的安全性比 fat32 高得多。有關詳細信息,請參見 windows 文檔。
使用不易破解的密碼,確保 web 服務器計算機和同一網絡上的所有計算機的安全。
確保 iis 的安全。有關詳細信息,請參見 microsoft 安全性 web 站點 (http://microsoft.com/technet/treeview/default.asp?url=/technet/security/bestprac/mcswebbp.asp) 上的文章“管理 windows iis web 服務的安全性”。

關閉不使用的端口并關閉不使用的服務。
運行監視通信量的病毒檢查程序。
建立并實施以下策略:禁止用戶將其密碼記在容易找到的位置。
使用防火墻。有關建議,請參見 microsoft 安全性站點上的“核對清單:安裝防火墻”。(http://microsoft.com/security/articles/firewall.asp)
了解和安裝來自 microsoft 和其他供應商的最新安全修補程序。例如,microsoft 安全站點 (www.microsoft.com/security) 中有所有 microsoft 產品的最新安全公告的列表。其他供應商也有類似站點。
使用 windows 事件日志記錄,并且經常檢查這些日志,以查找可疑活動。這樣的活動包括:反復嘗試登錄您的系統,以及向您的 web 服務器發出數量巨大的請求。


使用最少特權運行應用程序



當您的應用程序運行時,它運行在一個具有本地計算機(還可能是遠程計算機)的特定特權的上下文中。請遵循這些指導:

在具有最少實用特權的上下文中運行應用程序。默認情況下,在 iis 5 版中,asp.net 應用程序運行在名為 aspnet 的本地用戶的上下文中。在 windows server 2003 上的 iis 6 上,此帳戶稱為 network service。有關詳細信息,請參見 asp.net 進程標識和配置 asp.net 進程標識。
不要在系統用戶(管理員)的上下文中運行應用程序。
設置應用程序所需的所有資源上的權限(acl 或訪問控制列表)。使用最少的容許設置。例如,如果在您的應用程序中是可行的,則將文件設置為只讀。有關詳細信息,請參見 windows 文檔。
將您的 web 應用程序的文件保存在應用程序根目錄下的一個文件夾中。不要讓用戶指定在應用程序中進行文件訪問的路徑。這樣有助于防止用戶訪問服務器的根目錄。
不要使不需要調試 visual studio 應用程序的任何人成為“debugger users”(調試器用戶)組的成員。此組具有比“vs developers”(vs 開發人員)組更高的特權。有關詳細信息,請參見添加調試器用戶和配置 dcom。


了解您的用戶



在許多應用程序中,用戶有可能不必提供憑據即可訪問站點。如果是這樣,則您的應用程序通過在預定義用戶的上下文中運行即可訪問資源。默認情況下,此上下文是 web 服務器計算機上的本地 aspnet 用戶(windows 2000 或 windows xp)或 network service 用戶 (windows server 2003)。

若要僅允許已授權用戶進行訪問,請遵循以下準則:

如果您的應用程序是 intranet 應用程序,則將其配置為使用 windows 集成安全性。這樣,用戶的登錄憑據就可以用于訪問資源。
如果您需要從用戶收集憑據,則使用其中的一種 asp.net 身份驗證策略。有關更多信息,請參見 asp.net 身份驗證。有關示例,請參見簡單 forms 身份驗證。


防止惡意用戶的輸入



通常,決不假定從用戶獲得的輸入是安全的。對惡意用戶來說,從客戶端向您的應用程序發送潛在危險的信息是很容易的。若要防止惡意輸入,請遵循以下準則:

在窗體中,篩選用戶輸入以查找 html 標記,其中可能包含腳本。有關詳細信息,請參見在 web 應用程序中防止腳本利用。
決不回顯(顯示)未經篩選的用戶輸入。在顯示不受信任的信息之前,對 html 進行編碼以將潛在有害的腳本轉換為顯示字符串。
類似地,決不將未經篩選的用戶輸入存儲在數據庫中。
如果要接受來自用戶的一些 html,則手動篩選它。在您的篩選器中,顯式定義將要接受的內容。不要創建一個試圖篩選出惡意輸入的篩選器;因為預料到所有可能的惡意輸入是非常困難的。
不要假定您從標頭(通常通過 request 對象)獲得的信息是安全的。對查詢字符串、cookie 等采取安全措施。注意瀏覽器向服務器報告的信息(用戶代理信息)可以假冒,假如它在您的應用程序中是重要的。
如有可能,不要將敏感信息(如隱藏域或 cookie)存儲在可從瀏覽器訪問的位置。例如,不要將用戶名或密碼存儲在 cookie 中。
注意 視圖狀態是以編碼格式存儲在隱藏域中的。默認情況下,它包含消息身份驗證代碼 (mac),以便頁可以確定視圖狀態是否已被篡改。



創建安全的錯誤信息



如果您不小心,惡意用戶就可以從應用程序顯示的錯誤信息推斷出有關您的應用程序的重要信息。請遵循這些指導:

不要編寫會回顯可能對惡意用戶有用的信息(例如用戶名)的錯誤信息。
將應用程序配置為不向用戶顯示詳細錯誤。如果為進行調試而要顯示詳細錯誤信息,請先檢查該用戶是否為 web 服務器的本地用戶。有關詳細信息,請參見顯示安全的錯誤信息。
對于容易發生錯誤的情況(如數據庫訪問)創建自定義錯誤處理方式。


安全地保守秘密



“秘密”是指您不希望某人知道的信息。一個典型的秘密是密碼或加密密鑰。當然,如果惡意用戶能夠獲得秘密,則由該秘密保護的數據會受到危害。請遵循這些指導:

如果您的應用程序在瀏覽器和服務器之間傳輸敏感信息,請考慮使用安全套接字層 (ssl)。有關如何實現 ssl 的詳細信息,請參見 microsoft 知識庫文章 q307267“how to:在 windows 2000 中使用安全套接字層來保障 xml web services 的安全”(how to: secure xml web services with secure socket layer in windows 2000)。
如果您必須存儲秘密,即使是以您認為人們將無法看到它的形式(如在服務器代碼中)進行保存,也不要將它保存在 web 頁中。
如果您對信息加密,請不要創建您自己的加密算法。請使用 windows 數據保護 api (dpapi)。


安全地使用 cookie



為了讓用戶特定的信息保持可用,cookie 是一種容易而有用的方法。但是,由于 cookie 會被發送到瀏覽器所在的計算機,因此它們容易被假冒或用于其他惡意用途。請遵循這些指導:

不要將任何關鍵信息存儲在 cookie 中。例如,不要將用戶的密碼存儲在 cookie 中,即使是暫時存儲也不要這樣做。通常,不要將任何信息保存在 cookie 中(一旦它被假冒,就會給您帶來麻煩),而是在 cookie 中保存對信息在服務器上的位置的引用。
設置 cookie 的到期日期,使其有效期盡可能最短。如有可能,避免設置永久性 cookie。
考慮對 cookie 中的信息加密。


防止拒絕服務威脅



惡意用戶危害您的應用程序的一種間接方式是使其不可用。惡意用戶可以使應用程序太忙而無法為其他用戶提供服務,或者僅僅使應用程序出現故障。請遵循這些指導:

關閉或釋放您使用的任何資源。例如,在使用完畢后,始終關閉數據連接和數據讀取器,而且始終關閉文件。
使用錯誤處理(例如,try-catch)。包含 finally 塊,以便萬一失敗就可以在其中釋放資源。
將 iis 配置為使用進程調節,這樣可以防止應用程序消耗過多的 cpu 時間。有關詳細信息,請參見技術文章“使用 internet information server 5.0 的新功能:第 1 部分”。
在使用或存儲用戶輸入之前,測試它的大小限制。
對數據庫查詢的大小加以限制以確保安全。例如,在 web 窗體頁中顯示查詢結果之前,檢查包含的記錄數是否不合理。
如果文件上載是您的應用程序的一部分,則對它們的大小加以限制。您可以使用類似如下的語法在 web.config 文件中設置限制(其中 maxrequestlength 值以千字節為單位):





腳本利用

從瀏覽器的角度來看,web 頁只是一個長字符串。瀏覽器會順序處理這個字符串,在此過程中,會顯示某些字符,同時按特殊規則解釋其他字符(如 和 [c#] if ((useremail.value == "[email protected]") && (userpass.value == "password")) { formsauthentication.redirectfromloginpage (useremail.value, persist.checked); } else { msg.text = "invalid credentials: please try again."; } } 顯示窗體以收集登錄信息。

logon page
創建“用戶電子郵件名稱”(user e-mail name) 文本框。添加一個必填字段驗證程序控件和一個檢查電子郵件輸入是否有效的正則表達式驗證程序控件。 email:
創建“密碼”(password) 文本框。 password:
創建一個“持久性 cookie”(persistent cookie) 復選框。如果選中“持久性 cookie”框,則該 cookie 的有效期將跨瀏覽器會話。否則,在關閉瀏覽器時將銷毀該 cookie。 persistent cookie:
創建在回發時激發 logon_click 事件的“提交”按鈕。

default.aspx default.aspx 文件是被請求的、受保護的資源。它是僅顯示字符串 hello、記錄的電子郵件名稱和“注銷”(signout) 按鈕的簡單文件。 [visual basic]
using forms authentication

[c#]

using forms authentication



部署 web 解決方案

在本演練中,您將使用 visual basic 創建一個簡單的 web 窗體應用程序,然后創建一個安裝程序將該應用程序部署到 web 服務器上。

注意 在 visual basic .net 標準版中不能使用 web 安裝項目。有關更多信息,請參見 visual basic 標準版功能。
創建 web 窗體應用程序

在“文件”菜單上指向“新建”,然后選擇“項目”。
在“新建項目”對話框中,選擇“項目類型”窗格中的“visual basic 項目”,然后選擇“模板”窗格中的“asp.net web 應用程序”。在“位置”框中,鍵入 localhost/webapp1。
單擊“確定”關閉對話框。
項目被添加到解決方案資源管理器中,并且 web 窗體設計器打開。

在“工具箱”中選擇“web 窗體”選項卡。
選擇 button 控件并將其拖到 web 窗體中。
雙擊 button 控件為該按鈕添加事件處理程序。
在事件處理程序中添加下面的代碼:
button1.text = "abc"
這將把單擊按鈕時按鈕上顯示的文本更改為“abc”。

在“生成”菜單上,選擇“生成 webapp1”以生成該應用程序。
創建部署項目

在“文件”菜單上指向“添加項目”,然后選擇“新建項目”。
在“添加新項目”對話框中,選擇“項目類型”窗格中的“安裝和部署項目”,然后選擇“模板”窗格中的“web 安裝項目”。在“名稱”框中鍵入 webdeploy。
單擊“確定”關閉對話框。
項目被添加到解決方案資源管理器中,并且文件系統編輯器打開。

在“屬性”窗口中,選擇 productname 屬性,并鍵入 webapp1。
將 webapp1 項目的輸出添加到部署項目中

在“文件系統編輯器”中,選擇“web 應用程序”文件夾。在“操作”菜單上,指向“添加”,然后選擇“項目輸出”。
在“添加項目輸出組”對話框中,選擇“項目”下拉列表中的“webapp1”。
單擊“確定”關閉對話框。
從列表中選擇“主輸出”和“內容文件”組,然后單擊“確定”。
設置安裝程序的屬性

選擇 webapplication 文件夾。在“屬性”窗口中,將 virtualdirectory 屬性設置為 xyz。
在“屬性”窗口中,將 defaultdocument 屬性設置為 webform1.aspx。
在“生成”菜單上選擇“生成 webdeploy”。
將應用程序部署到開發計算機上的 web 服務器上

在解決方案資源管理器中,選擇 webdeploy 項目。在“項目”菜單上選擇“安裝”。
注意 必須在計算機上具有安裝權限才能運行安裝程序,而且必須具有 iis(internet 信息服務)權限才能安裝到 web 服務器。
若要訪問已部署的 web 應用程序,請啟動 internet explorer,然后鍵入 url localhost/xyz。注意,當在 web 頁上單擊該按鈕時,該按鈕上的文本將更改為“abc”。
將應用程序部署到另一臺計算機上的 web 服務器

在 windows 資源管理器中,定位到項目目錄并查找所生成的安裝程序。默認路徑是 /documents and settings/yourloginname/ my documents/visual studio projects/webapp1/webdeploy/project configuration/webdeploy.msi。默認“項目配置”是“調試”。
將該目錄中的 webdeploy.msi 文件以及其他所有文件和子目錄復制到 web 服務器計算機上。
在 web 服務器計算機上,雙擊 setup.exe 文件運行安裝程序。
注意 必須在計算機上具有安裝權限才能運行安裝程序,而且必須具有 iis 權限才能安裝到 web 服務器。
若要訪問已部署的 web 應用程序,請啟動 internet explorer,并鍵入 url [computername]/xyz。注意,當在 web 頁上單擊該按鈕時,該按鈕上的文本將更改為“abc”。
卸載應用程序

在 windows“控制面板”中,雙擊“添加/刪除程序”。
在“添加/刪除程序”對話框中,選擇“webapp1”,并單擊“刪除”。
單擊“確定”關閉對話框。
提示 若要從開發計算機上卸載,請在“項目”菜單上選擇“卸載”。


使用業務對象在業務組件中封裝邏輯是實際應用程序的基本組成部分,不論是基于 web 的應用程序還是任何其他應用程序。在 asp.net 中,業務對象是多層 web 應用程序(如包含數據訪問層或通用應用程序規則層的應用程序)的生成塊。本節說明如何編寫一些簡單的組件并將它們包括在應用程序的 web 窗體頁中。 應用程序 /bin 目錄 使用 web 應用程序組件的 com 模型時遇到的問題是,這些組件必須注冊(通常是使用 regsvr32 工具)后才能在傳統的 asp 應用程序中使用。對這些類型的應用程序進行遠程管理通常是不可能的,因為注冊工具必須在服務器上以本地方式運行。更為棘手的是,這些組件經應用程序加載后便在磁盤上保持鎖定狀態,必須使整個 web 服務器停止運行后才能替換或移除這些組件。 為嘗試解決這些問題,asp.net 允許將組件放置在已知目錄中并在運行時自動找到它們。該已知目錄總是命名為 /bin,并緊位于應用程序根目錄(一個由 internet 信息服務 (iis) 定義的虛擬目錄)下。這樣做的好處是組件無需注冊便可在 asp.net framework 應用程序中使用——只需將組件復制到 /bin 目錄或執行 ftp 文件傳輸便可部署組件。 除提供零注冊方法部署復雜組件外,asp.net 不要求這些組件在運行時在磁盤上保持鎖定狀態。asp.net 在后臺復制 /bin 中的程序集并加載這些 shadow 副本。原始組件即使在 web 服務器仍在運行時也可以替換,而對 /bin 目錄的更改則由運行時自動獲取。當檢測到更改時,asp.net 允許完成當前執行的請求,并將所有新傳入的請求定向到使用新組件的應用程序。 導入業務對象
從最基本的層面看,業務組件只是一個類,可以從導入它的 web 窗體頁為其創建實例。下面的示例定義一個簡單的 helloworld 類。該類有一個公共構造函數(當初次創建該類的實例時執行此構造函數)、一個稱為 firstname 的 string 屬性和一個通過 firstname 屬性值打印問候語的 sayhello 方法。


using system;
using system.text;

namespace helloworld {
public class helloobj {
private string _name;

public helloobj() {
_name = null;

}

public string firstname {
get {
return _name;
}
set {
_name = value;
}
}

public string sayhello() {
stringbuilder sb = new stringbuilder("hello ");
if (_name != null)
sb.append(_name);
else
sb.append("world");

sb.append("!");
return sb.tostring();
}
}
}


imports system
imports system.text

namespace helloworld
public class helloobj
private _name as string

public sub new
mybase.new()
_name = nothing
end sub

public property firstname as string
get
return(_name)
end get
set
_name = value
end set
end property

public function sayhello() as string
dim sb as new stringbuilder("hello ")
if (_name <> nothing) then
sb.append(_name)
else
sb.append("world")
end if
sb.append("!")
return(sb.tostring())
end function
end class
end namespace


import system;
import system.text;

package helloworld {
public class helloobj {
private var _name:string;

public function helloobj() {
_name = null;

}

public function get firstname() : string
{
return _name;
}
public function set firstname(value:string) : void
{
_name = value;
}

public function sayhello() : string {
sb:stringbuilder = new stringbuilder("hello ");
if (_name != null)
sb.append(_name);
else
sb.append("world");

sb.append("!");
return sb.tostring();
}
}
}


c# vb jscript
若要編譯該類,應從命令行運行 c# 編譯器 (csc.exe)。/t 選項通知編譯器生成庫 (dll),/out 選項通知編譯器將結果程序集放置到的位置。本例中,應用程序的 /bin 目錄緊位于本教程的“aspplus”虛擬根目錄下,并假設該命令從示例目錄,即 .../quickstart/aspplus/samples/webforms/busobjs 運行。


csc /t:library /out:../../../../bin/helloobj.dll helloobj.cs

對于 visual basic,等效編譯命令是:


vbc /t:library /out:../../../../bin/helloobjvb.dll helloobj.vb

對于 jscript,等效編譯命令是:


jsc /out:../../../../bin/helloobjjs.dll helloobj.js

該組件現在可供應用程序中任何需要使用它的 web 窗體頁使用。下面的 helloobj.aspx 示例闡釋了此功能。


簡單的兩層 web 窗體頁外部組件的典型用途是執行數據訪問。它簡化了頁中的代碼,增強了可讀性并將用戶界面 (ui) 邏輯與系統功能分開。下面的實例闡釋了簡單的兩層 web 窗體頁,它使用數據訪問組件檢索產品信息。










a simple two-tier webform

select a category:




















using system.reflection;

[assembly: assemblytitle("")]
[assembly: assemblydescription("a quickstart tutorial assembly")]
[assembly: assemblyconfiguration("")]
[assembly: assemblycompany("microsoft corporation")]
[assembly: assemblyproduct("microsoft quickstart tutorials")]
[assembly: assemblycopyright(" microsoft corporation. all rights reserved.")]
[assembly: assemblytrademark("")]
[assembly: assemblyculture("")]
[assembly: assemblyversion("1.1.*")]

namespace datalayer
{
using system;
using system.data;
using system.data.sqlclient;

public class dataobj
{
private string _connstr;

public dataobj()
{
_connstr = null;
}

public dataobj(string connstr)
{
_connstr = connstr;
}

public string connectionstring
{
get
{
return _connstr;
}
set
{
_connstr = value;
}
}

public dataview getcategories()
{
sqlconnection myconnection = new sqlconnection(_connstr);
sqldataadapter mycommand = new sqldataadapter("select distinct categoryname from categories", myconnection);

dataset ds = new dataset();
try {
mycommand.fill(ds, "categories");

return ds.tables["categories"].defaultview;
}
catch (exception ex){
throw (ex);
}
finally{
myconnection.close();
}
}

public dataview getproductsforcategory(string category)
{
sqlconnection myconnection = new sqlconnection(_connstr);
sqldataadapter mycommand = new sqldataadapter("select productname, imagepath, unitprice, c.categoryid from products p, categories c where c.categoryname='" + category + "' and p.categoryid = c.categoryid", myconnection);

dataset ds = new dataset();
try {
mycommand.fill(ds, "products");

return ds.tables["products"].defaultview;
}
catch (exception ex){
throw (ex);
}
finally{
myconnection.close();
}
}
}

}

簡單的三層 web 窗體頁三層應用程序模型擴展了兩層方案,在用戶界面和數據訪問邏輯之間包含了業務規則。此模型允許用戶界面開發人員處理更高抽象化的級別,而不是通過低級數據訪問組件 api 直接操作數據。中間業務組件通常強制業務規則并確保遵守數據庫的關系和主鍵約束。下面的示例使用中間組件基于客戶端輸入的兩位供應商 id 計算折扣。











a simple three-tier web form

select a category:



preferred customer id:








customer id must be two numeric digits



















using system.reflection;

[assembly: assemblytitle("")]
[assembly: assemblydescription("a quickstart tutorial assembly")]
[assembly: assemblyconfiguration("")]
[assembly: assemblycompany("microsoft corporation")]
[assembly: assemblyproduct("microsoft quickstart tutorials")]
[assembly: assemblycopyright(" microsoft corporation. all rights reserved.")]
[assembly: assemblytrademark("")]
[assembly: assemblyculture("")]
[assembly: assemblyversion("1.1.*")]

namespace businesslayer
{
using system;
using system.data;
using system.data.sqlclient;
using datalayer;

public class busobj
{
private dataobj data;

public busobj()
{
data = new dataobj("server=(local)//netsdk;database=grocertogo;integrated security=sspi");
}

public dataview getcategories()
{
return data.getcategories();
}

public dataview getproductsforcategory(string category, int customerid)
{
dataview view = data.getproductsforcategory(category);

double discount = 0;
if ((customerid >= 25)&&(customerid < 50))
{
discount = .50;
}
else if ((customerid >= 50)&&(customerid < 75))
{
discount = 1.00;
}
else if ((customerid >= 75)&&(customerid < 100))
{
discount = 1.50;
}

for (int i=0; iusing system.reflection;

[assembly: assemblytitle("")]
[assembly: assemblydescription("a quickstart tutorial assembly")]
[assembly: assemblyconfiguration("")]
[assembly: assemblycompany("microsoft corporation")]
[assembly: assemblyproduct("microsoft quickstart tutorials")]
[assembly: assemblycopyright(" microsoft corporation. all rights reserved.")]
[assembly: assemblytrademark("")]
[assembly: assemblyculture("")]
[assembly: assemblyversion("1.1.*")]

namespace datalayer
{
using system;
using system.data;
using system.data.sqlclient;

public class dataobj
{
private string _connstr;

public dataobj()
{
_connstr = null;
}

public dataobj(string connstr)
{
_connstr = connstr;
}

public string connectionstring
{
get
{
return _connstr;
}
set
{
_connstr = value;
}
}

public dataview getcategories()
{
sqlconnection myconnection = new sqlconnection(_connstr);
sqldataadapter mycommand = new sqldataadapter("select distinct categoryname from categories", myconnection);

dataset ds = new dataset();
try {
mycommand.fill(ds, "categories");

return ds.tables["categories"].defaultview;
}
catch (exception ex){
throw (ex);
}
finally{
myconnection.close();
}
}

public dataview getproductsforcategory(string category)
{
sqlconnection myconnection = new sqlconnection(_connstr);
sqldataadapter mycommand = new sqldataadapter("select productname, imagepath, unitprice, c.categoryid from products p, categories c where c.categoryname='" + category + "' and p.categoryid = c.categoryid", myconnection);

dataset ds = new dataset();
try {
mycommand.fill(ds, "products");

return ds.tables["products"].defaultview;
}
catch (exception ex){
throw (ex);
}
finally{
myconnection.close();
}
}
}

}
向文件寫入文本using system;
using system.io;

class test
{
public static void main()
{
// create an instance of streamwriter to write text to a file.
// the using statement also closes the streamwriter.
using (streamwriter sw = new streamwriter("testfile.txt"))
{
// add some text to the file.
sw.write("this is the ");
sw.writeline("header for the file.");
sw.writeline("-------------------");
// arbitrary objects can also be written to the file.
sw.write("the date is: ");
sw.writeline(datetime.now);
}
}
}
using system;
using system.io;
public class texttofile
{
private const string file_name = "myfile.txt";
public static void main(string[] args)
{
if (file.exists(file_name))
{
console.writeline("{0} already exists.", file_name);
return;
}
streamwriter sr = file.createtext(file_name);
sr.writeline ("this is my file.");
sr.writeline ("i can write ints {0} or floats {1}, and so on.",
1, 4.2);
sr.close();
}
}

從文件讀取文本using system;
using system.io;

class test
{
public static void main()
{
try
{
// create an instance of streamreader to read from a file.
// the using statement also closes the streamreader.
using (streamreader sr = new streamreader("testfile.txt"))
{
string line;
// read and display lines from the file until the end of
// the file is reached.
while ((line = sr.readline()) != null)
{
console.writeline(line);
}
}
}
catch (exception e)
{
// let the user know what went wrong.
console.writeline("the file could not be read:");
console.writeline(e.message);
}
}
}
using system;
using system.io;
public class textfromfile
{
private const string file_name = "myfile.txt";
public static void main(string[] args)
{
if (!file.exists(file_name))
{
console.writeline("{0} does not exist.", file_name);
return;
}
streamreader sr = file.opentext(file_name);
string input;
while ((input=sr.readline())!=null)
{
console.writeline(input);
}
console.writeline ("the end of the stream has been reached.");
sr.close();
}
}

file.appendtext 方法 創建一個 streamwriter,它將 utf-8 編碼文本追加到現有文件。public static streamwriter appendtext(string path);參數path 要向其中追加內容的文件的路徑。 返回值一個 streamwriter,它將 utf-8 編碼文本追加到現有文件。將文本追加到文件using system;
using system.io;

class test
{
public static void main()
{
string path = @"c:/temp/mytest.txt";
// this text is added only once to the file.
if (!file.exists(path))
{
// create a file to write to.
using (streamwriter sw = file.createtext(path))
{
sw.writeline("hello");
sw.writeline("and");
sw.writeline("welcome");
}
}

// this text is always added, making the file longer over time
// if it is not deleted.
using (streamwriter sw = file.appendtext(path))
{
sw.writeline("this");
sw.writeline("is extra");
sw.writeline("text");
}

// open the file to read from.
using (streamreader sr = file.opentext(path))
{
string s = "";
while ((s = sr.readline()) != null)
{
console.writeline(s);
}
}
}
}

using system;
using system.io;

class test
{

public static void main()
{
fileinfo fi = new fileinfo(@"c:/temp/mytest.txt");

// this text is added only once to the file.
if (!fi.exists)
{
//create a file to write to.
using (streamwriter sw = fi.createtext())
{
sw.writeline("hello");
sw.writeline("and");
sw.writeline("welcome");
}
}

// this text will always be added, making the file longer over time
// if it is not deleted.
using (streamwriter sw = fi.appendtext())
{
sw.writeline("this");
sw.writeline("is extra");
sw.writeline("text");
}

//open the file to read from.
using (streamreader sr = fi.opentext())
{
string s = "";
while ((s = sr.readline()) != null)
{
console.writeline(s);
}
}
}
}
=====================================
using system;
using system.io;

public class appendtexttest
{
public static void main()
{
// create a reference to a file, which might or might not exist.
// if it does not exist, it is not yet created.
fileinfo fi = new fileinfo("temp.txt");
// create a writer, ready to add entries to the file.
streamwriter sw = fi.appendtext();
sw.writeline("add as many lines as you like...");
sw.writeline("add another line to the output...");
sw.flush();
sw.close();
// get the information out of the file and display it.
// remember that the file might have other lines if it already existed.
streamreader sr = new streamreader(fi.openread());
while (sr.peek() != -1)
console.writeline( sr.readline() );
}
}
移動一個文件將指定文件移到新位置,并提供指定新文件名的選項。public static void move(string sourcefilename,string destfilename);參數sourcefilename 要移動的文件的名稱。 destfilename 文件的新路徑。 using system;
using system.io;

class test
{
public static void main()
{
string path = @"c:/temp/mytest.txt";
string path2 = path + "temp";
try
{
if (!file.exists(path))
{
// this statement ensures that the file is created,
// but the handle is not kept.
using (filestream fs = file.create(path)) {}
}

// ensure that the target does not exist.
if (file.exists(path2))
file.delete(path2);

// move the file.
file.move(path, path2);
console.writeline("{0} was moved to {1}.", path, path2);

// see if the original exists now.
if (file.exists(path))
{
console.writeline("the original file still exists, which is unexpected.");
}
else
{
console.writeline("the original file no longer exists, which is expected.");
}

}
catch (exception e)
{
console.writeline("the process failed: {0}", e.tostring());
}
}
}

將一個文件移動至另一位置并重命名該文件。using system;
using system.io;

public class movetotest
{
public static void main()
{
// create a reference to a file, which might or might not exist.
// if it does not exist, it is not yet created.
fileinfo fi = new fileinfo("temp.txt");
// create a writer, ready to add entries to the file.
streamwriter sw = fi.appendtext();
sw.writeline("add as many lines as you like...");
sw.writeline("add another line to the output...");
sw.flush();
sw.close();
// ensure that the target file does not exist, since this is disallowed.
if (file.exists("newtemp.txt"))
file.delete("newtemp.txt");
// move this file to another file.
fi.moveto("newtemp.txt");
// get the information out of the new file and display it.
streamreader sr = new streamreader( fi.openread() );
console.writeline("{0}this is the information in the new file '{1}':", environment.newline, fi.name);
while (sr.peek() != -1)
console.writeline( sr.readline() );
}
}



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 武城县| 宁明县| 岢岚县| 垫江县| 东光县| 合川市| 红原县| 广平县| 新建县| 河西区| 津市市| 志丹县| 景谷| 遂平县| 施秉县| 元朗区| 上犹县| 灌南县| 琼中| 定安县| 青田县| 兴隆县| 台北市| 北票市| 钟山县| 天祝| 太原市| 惠来县| 施秉县| 德昌县| 普陀区| 永安市| 上犹县| 建湖县| 元江| 沾化县| 东山县| 聊城市| 盐边县| 灵寿县| 巴林左旗|