PIXNET Logo登入

七月的筆記本

跳到主文

七月的筆記本

部落格全站分類:數位生活

  • 相簿
  • 部落格
  • 留言
  • 名片
  • 9月 01 週三 201011:41
  • 製造業中常用的英文縮寫

製造業中常用的英文縮寫



品質人員名稱類
QC      quality control              品質管理人員
FQC     final quality control        終點質量管理人員
IPQC     in process quality control  製程中的質量管理人員
OQC     output quality control       最終出貨質量管理人員
IQC     incoming quality control     進料質量管理人員
TQC     total quality control        全面質量管理
POC     passage quality control      段檢人員
QA      quality assurance            質量保證人員
OQA     output quality assurance     出貨質量保證人員
QE      quality engineering          品質工程人員
 
品質保證類
FAI     first article inspection               新品首件檢查
FAA     first article assurance                首件確認
CP     capability index                        能力指數 媵
CPK     capability process index               模具製程能力參數
SSQA     standardized supplier quality audit   合格供貨商品質評估
FMEA     failure model effectiveness analysis  失效模式分析
 
FQC運作類
AQL     Acceptable Quality Level       運作類允收品質水準
S/S     Sample size                    抽樣檢驗樣本大小
ACC     Accept                         允收
REE     Reject                         拒收
CR     Critical                        極嚴重的
MAJ     Major                          主要的
MIN     Minor                          輕微的
Q/R/S     Quality/Reliability/Service  品質/可靠度/服務
P/N     Part Number                    料號 藊
L/N     Lot Number                     批號
AOD     Accept On Deviation            特采
UAI     Use As It                      特采
FPIR     First Piece Inspection Report 首件檢查報告
PPM     Percent Per Million            百萬分之一
 
製程統計品管專類
SPC   Statistical Process Control     統計製程管制
SQC   Statistical Quality Control     統計質量管理
GRR   Gauge Reproductiveness & Repeatability 量具之再製性及重測性判斷量可靠與否
DIM     Dimension  尺寸
DIA     Diameter   直徑
N       Number     樣品數
 
其它品質術語類
QIT     Quality Improvement Team     品質改善小組 
ZD      Zero Defect                  零缺點
QI      Quality Improvement          品質改善
QP      Quality Policy               目標方針
TQM     Total Quality Management     全面品質管理
RMA     Return Material Audit        退料認可
7QCTools  7 Quality Control Tools    品管七大手法
 
通用之件類
ECN     Engineering Change Notice    工程變更通知(供貨商)
ECO     Engineering Change Order     工程改動要求(客戶) 
PCN     Process Change Notice        工序改動通知
PMP     Product Management Plan      生產管制計劃
SIP     Standard Inspection Procedure    製程檢驗標準程序 
SOP     Standard Operation Procedure     製造作業規範  
IS      Inspection Specification         成品檢驗規範  
BOM     Bill Of Material       物料清單
PS     Package Specification   包裝規範 
SPEC     Specification         規格
DWG     Drawing                圖面
 
系統文件類
ES      Engineering Standard                 工程標準
IWS     International Workman Standard       工藝標準  
ISO     International Standard Organization  國際標準化組織  
GS      General Specification                 一般規格
 
部類 
PMC    Production & Material Control   生產和物料控制 
PCC    Product control center          生產管制中心 
PPC    Production Plan Control         生產計劃控制
MC     Material Control                物料控制
DC     Document Center                 資料中心
QE     Quality Engineering             品質工程(部)
QA     Quality Assurance               品質保證(處)
QC     Quality Control                 質量管理(課)  
PD     Product Department              生產部
LAB     Laboratory                     實驗室 
IE     Industrial Engineering          工業工程  
R&D     Research & Design              設計開發部
 
生產類 
PCs     Pieces               個(根,塊等)
PRS     Pairs                雙(對等)  
CTN     Carton               卡通箱  
PAL     Pallet/skid          棧板 
PO      Purchasing Order     採購訂單
MO      Manufacture Order    生產單  
D/C     Date Code            生產日期碼 
ID/C    Identification Code  (供貨商)識別碼]
SWR     Special Work Request           特殊工作需求
L/N     Lot Number                     批號
P/N     Part Number                     料號
OEM     Original Equipment Manufacture  原設備製造 
PC     Personal Computer                個人計算機
CPU     Central Processing Unit         中央處理器  
A.S.A.P     As Soon As Possible         儘可能快的  
E-MAIL     Electrical-Mail              電子郵件
N/A     Not Applicable       不適用
QTY     Quantity             數量 
I/O     input/output         輸入/輸出  
NG     Not Good              不行,不合格
C=0     Critical=0           極嚴重不允許
APP     Approve              核准,認可,承認
CHK     Check                確認 
ASS''Y     Assembly           裝配,組裝 
T/P     True Position        真位度
5WIH   When, Where, Who, What, Why, How to
6M     Man, Machine, Material, Method, Measurement, Message
4MTH   Man, Material, Money, Method, Time, How   人力,物力,財務,技術,時間(資源)
SQA     Strategy Quality Assurance              策略品質保證
DQA     Design Quality Assurance                設計品質保證 
MQA     Manufacture Quality Assurance            製造品質保證
SSQA     Sales and service Quality Assurance     銷售及服務品質保證 
LRR     Lot Reject Rate                           批退率
DVD     Digital Video Disk
VCD     Video Compact Disk 
LCD     Liquid Crystal Display
CAD     Computer Aided Design
CAM     Computer Aided Manufacturing
CAE     Computer Aided Engineering 
PCB     Printed Circuit Board           印刷電路板  
CAR     Correction Action Report        改善報告
NG     Not Good                         不良
WDR     Weekly Delivery Requirement     周出貨要求  
PPM     Percent Per Million             百萬分之一 
TPM     Total Production Maintenance    全面生產保養 
MRP     Material Requirement Planning   物料需計劃
OS     Operation System                 操作系統  
TBA     To Be Assured                   待定,定缺
D/C     Drawing Change
P/P     Plans & Procedure
EMI     Electrical-Music Industry       電子音樂工業
    Electrical Magnetic Interference    電子干擾
RFI     Read Frequency Input            讀頻輸入
MMC     Maximum Material Condition 
MMS     Maximum Material Size Xs
LMC     Least Material Condition
LMS     Least Material Size Um 
LED   lighting-emitting diode           發光二極管
QBR   Quarter Business Record 
CIP   Continuous improvement process  
FGI   Forecasted Goal Inventory
CNC   Computerized numeral controller 
B2C   Business to customer  
B2B   Business to business
AVL   Approved vendor list 
POP   Procedure of packaging   
EOL   End of life
VDCS   Vender defect correcting sheet
PDCS   Process defect correcting sheet  
GRN     Goods receiving note
A/R     Accounting receivable
A/P     Accounting payable
(繼續閱讀...)
文章標籤

icejuly 發表在 痞客邦 留言(4) 人氣(282,871)

  • 個人分類:學習系
▲top
  • 11月 20 週五 200918:15
  • 使用HttpWebRequest 登入網站並POST查詢‏

使用HttpWebRequest 登入網站並POST查詢
 
我要做一個自動化查詢的小程式。他會自動去網頁送出查詢然後分析結果,但這個頁面需要先登入。
用.net framework的HttpWebRequest和HttpWebResponse可以幫我做送出接收的動作。

 流程大概是:
  • 送出request (using GET)-> login page
    取得response 取得網頁
    parse source code
     

  • 送出request (using POST) -> login page 送出登入資料
    登入成功
    取得response
     

  • 送出requset (using GET) -> query page 要求查詢頁
    取得response 取得查詢頁
    parse source code
     

  • 送出request (using POST) -> query page 進行查詢
    取得response 得到查詢結果
  • 有幾點注意:
    1.parse是為了要取得hidden的viewstate,必須從原始碼抓出來。
    2.如果只是請求頁面而沒有傳表單值過去,不要用POST,不然程式會卡在那邊等你。
    3.而method用POST的時候,要給ContentLength。不要自己設,取byte[]的長度,不然也會出錯。
    4.登入後用一個CookieContainer存下,之後的請求在附上去。不然server不知道你有登入過啦。

    到三步為止沒有什麼問題,登入成功,也取回了我要查詢的那頁原始碼。
    但是我要在送出查詢的時候就出錯了。得到的exception是 500內部伺服器錯誤。

    沒什麼幫助。試了老半天,最後找了一個監看HTTP的程式幫忙。看我是不是有少了什麼變數沒有給到。
     
    沒有阿...該有的都有了。
    發現有比較詳細的錯誤訊息可以看。


     
    他說是invalid ViewState。仔細看裡面還有說Base64 byte array format error
    GOOGLE找了找,問題出在那一串看似亂碼的viewstate,裡面有"+"號,這個東西,在傳送的時候會變成空白。server 端解讀的時候就會出錯了。解法很簡單,把它UrlEncode就好了。(看似複雜的東西,問題總是出在很簡單的地方)
    最後就順利解決,抓到我掉的東西囉。
    下面是HttpWebRequest, HttpWebResponse物件的用法
     HttpWebRequest request = WebRequest.Create(URI) as HttpWebRequest;    
     request.Method = "POST";    
     request.KeepAlive = true;  //是否保持連線  
     request.ContentType = "application/x-www-form-urlencoded";    
     request.CookieContainer = cookieContainer;   //server 才知道你是誰 
     request.ContentLength = postData.Length;  
       
     HttpWebResponse response = request.GetResponse() as HttpWebResponse;  
     Stream responseStream = response.GetResponseStream();  
     StreamReader reader = new  StreamReader(responseStream, Encoding.UTF8);  
     src = reader.ReadToEnd(); 
     心得: 若有要模擬瀏覽器做自動化查詢的動作,http watch這類的東西還不錯用,可以看的一清二楚。
    參考資料:
    比較完整的程式碼參考 http://www.cnblogs.com/anjou/archive/2007/10/15/923770.html
    我用的監看程式: HTTP Analyzer http://www.ieinspector.com/httpanalyzer/download.html
    (繼續閱讀...)
    文章標籤

    icejuly 發表在 痞客邦 留言(0) 人氣(2,878)

    • 個人分類:學習系
    ▲top
    • 11月 12 週四 200915:30
    • [ASP.NET]Session詳解 (轉載)


        閱讀本文章之前的準備
        閱讀本文章前,需要讀者對以下知識有所瞭解。否則,閱讀過程中會在相應的內容上遇到不同程度的問題。
     
        懂得ASP/ASP.NET編程
        瞭解ASP/ASP.NET的Session模型
        瞭解ASP.NET Web應用程序模型
        瞭解ASP.NET Web應用程序配置文件Web.config的作用、意義及使用方法
        瞭解Internet Information Services(以下簡稱IIS)的基本使用方法
        瞭解如何在Microsoft SQL Server中創建一個數據庫。
      Session模型簡介
        Session是什麼呢?簡單來說就是服務器給客戶端的一個編號。當一台WWW服務器運行時,可能有若干個用戶瀏覽正在運正在這台服務器上的網站。當每個用戶首次與這台WWW服務器建立連接時,他就與這個服務器建立了一個Session,同時服務器會自動為其分配一個SessionID,用以標識這個用戶的唯一身份。這個SessionID是由WWW服務器隨機產生的一個由24個字符組成的字符串,我們會在下面的實驗中見到它的實際樣子。
     
        這個唯一的SessionID是有很大的實際意義的。當一個用戶提交了表單時,瀏覽器會將用戶的SessionID自動附加在HTTP頭信息中,(這是瀏覽器的自動功能,用戶不會察覺到),當服務器處理完這個表單後,將結果返回給SessionID所對應的用戶。試想,如果沒有SessionID,當有兩個用戶同時進行註冊時,服務器怎樣才能知道到底是哪個用戶提交了哪個表單呢。當然,SessionID還有很多其他的作用,我們會在後面提及到。
     
        除了SessionID,在每個Session中還包含很多其他信息。但是對於編寫ASP或ASP.NET的程序與來說,最有用的還是可以通過訪問ASP/ASP.NET的內置Session對象,為每個用戶存儲各自的信息。例如我們想瞭解一下訪問我們網站的用戶瀏覽了幾個頁面,我們可能在用戶可能訪問到每個的頁面中加入:
     
      <%
      If Session("PageViewed") = ""Then
       Session("PageViewed") = 1
      Else
       Session("PageViewed") = Session("PageViewed")  1
      End If
      %>
        通過以下這句話可以讓用戶得知自己瀏覽了幾個頁面:
     
     
      <%
      Response.Write("You have viewed " &; Session("PageViewed") &; " pages")
      %>
     
        可能有些有些讀者會問:這個看似像是數組的Session(「..」)是哪裡來的?需要我定義嗎?實際上,這個Session對象是具有ASP解釋能力的的WWW服務器的內建對象。也就是說ASP的系統中已經給你定義好了這個對象,你只需要使用就行了。其中Session(「..」)中的..就好像變量名稱,Session(「..」)=$$中的$$就是變量的值了。你只需要寫上句話,在這個用戶的每個頁面中都可以訪問..變量中的值了。
     
        其實ASP一共內建了7個對象,有Session、Application、Cookie、Response、Request、Server等。在其他的服務器端腳本語言如JSP、PHP等中也有其類似的對象,只是叫法或者使用方法上不太一樣。
     
      ASP Session的功能的缺陷
        目前ASP的開發人員都正在使用Session這一強大的功能,但是在他們使用的過程中卻發現了ASP Session有以下缺陷:
     
        進程依賴性:ASP Session狀態存於IIS的進程中,也就是inetinfo.exe這個程序。所以當inetinfo.exe進程崩潰時,這些信息也就丟失。另外,重起或者關閉IIS服務都會造成信息的丟失。
        Session狀態使用範圍的局限性:剛一個用戶從一個網站訪問到另外一個網站時,這些Session信息並不會隨之遷移過去。例如:新浪網站的WWW服務器可能不止一個,一個用戶登錄之後要去各個頻道瀏覽,但是每個頻道都在不同的服務器上,如果想在這些WWW服務器共享Session信息怎麼辦呢?
      Cookie的依賴性:實際上客戶端的Session信息是存儲與Cookie中的,如果客戶端完全禁用掉了Cookie功能,他也就不能享受到了Session提供的功能了。
      鑒於ASP Session的以上缺陷,微軟的設計者們在設計開發 ASP.NET Session時進行了相應的改進,完全克服了以上缺陷,使得ASP.NET Session成為了一個更加強大的功能。
     
      Web.config文件簡介
        有的ASP.NET程序員說:Web.config文件?我從來沒有聽說過啊,可是我寫的程序不是也能很正常的運轉嗎?是的,你說得沒錯,沒有Web.config文件程序是可以正常運行的。但是,如果你做了一個大型的網站,需要對整個網站做一些整體配置,例如整個網站的頁面使用何種語言編寫的、網站的安全認證模式、Session信息存儲方式等,這時你就需要使用Web.config文件了。雖然Web.config文件中的某些選項是可以通過IIS配置的,但是如果在Web.config中也有相應的設置就會覆蓋掉IIS中的配置。而且,Web.config文件的最大的便利之處就是可以在ASP.NET頁面中通過調用System.web名字空間訪問Web.config中的設置。
     
        Web.config有兩種,分別是服務器配置文件和Web應用程序配置文件,他們都名為Web.config。在這個配置文件中會保存當前IIS服務器中網頁的使用哪種語言編寫的、應用程序安全認證模式、Session信息存儲方式的一系列信息。這些信息是使用XML語法保存的,如果想對其編輯,使用文本編輯器就行了。
     
        其中服務器配置文件會對IIS服務器下所有的站點中的所有應用程序起作用。在.NET Framework 1.0中,服務器的Web.config文件是存在:\WinNT\Microsoft.NET\Framework\v1.0.3705中的。
     
        而Web應用程序配置文件Web.config則保存在各個Web應用程序中。例如:當前網站的根目錄\Inetpub\wwwroot,而當前的Web應用程序為MyApplication,則Web應用程序根目錄就應為:\Inetpub\wwwroot\MyApplication。如果你的網站有且只有一個Web應用程序,一般說來應用程序的根目錄就是\Inetpub\wwwroot。如果想添加一個Web應用程序,在IIS中添加一個具有應用程序起始點的虛擬目錄就行了。這個目錄下的文件及目錄將被視為一個Web應用程序。但是,這樣通過IIS添加Web應用程序是不會為你生成Web.config文件的。如果想創建一個帶有Web.config文件的Web應用程序,需要使用Visual Studio.NET,新建一個Web應用程序項目。
     
        Web應用程序的配置文件Web.config是可選的,可有可無。如果沒有,每個Web應用程序會使用服務器的Web.config配置文件。如果有,則會覆蓋服務器Web.config配置文件中相應的值。
     
        在ASP.NET中,Web.config修改保存後會自動立刻成效,不用再像ASP中的配置文件修改後需要重新啟動Web應用程序才能生效了。
     
      Web.config文件中的Session配置信息
        打開某個應用程序的配置文件Web.config後,我們會發現以下這段:
     
      <sessionState
        mode="InProc"
        stateConnectionString="tcpip=127.0.0.1:42424"
        sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
        cookieless="false"
        timeout="20"
      />
        這一段就是配置應用程序是如何存儲Session信息的了。我們以下的各種操作主要是針對這一段配置展開。讓我們先看看這一段配置中所包含的內容的意思。sessionState節點的語法是這樣的:
     
      <sessionState mode="Off|InProc|StateServer|SQLServer"
                    cookieless="true|false"
                    timeout="number of minutes"
                    stateConnectionString="tcpip=server:port"
                    sqlConnectionString="sql connection string"
                    stateNetworkTimeout="number of seconds"
      />
     
     
      必須有的屬性是
     
      屬性 選項 描述
      mode  設置將Session信息存儲到哪裡
      Off 設置為不使用Session功能
      InProc 設置為將Session存儲在進程內,就是ASP中的存儲方式,這是默認值。
      StateServer 設置為將Session存儲在獨立的狀態服務中。
      SQLServer 設置將Session存儲在SQL Server中。
     
      可選的屬性是:
     
      屬性 選項 描述
      cookieless  設置客戶端的Session信息存儲到哪裡
      ture 使用Cookieless模式
      false 使用Cookie模式,這是默認值。
      timeout  設置經過多少分鐘後服務器自動放棄Session信息。默認為20分鐘
      stateConnectionString  設置將Session信息存儲在狀態服務中時使用的服務器名稱和端口號,例如:"tcpip=127.0.0.1:42424」。當mode的值是StateServer是,這個屬性是必需的。
      sqlConnectionString  設置與SQL Server連接時的連接字符串。例如"data source=localhost;Integrated Security=SSPI;Initial Catalog=northwind"。當mode的值是SQLServer時,這個屬性是必需的。
      stateNetworkTimeout  設置當使用StateServer模式存儲Session狀態時,經過多少秒空閒後,斷開Web服務器與存儲狀態信息的服務器的TCP/IP連接的。默認值是10秒鐘。
     
      ASP.NET中客戶端Session狀態的存儲
        在我們上面的Session模型簡介中,大家可以發現Session狀態應該存儲在兩個地方,分別是客戶端和服務器端。客戶端只負責保存相應網站的SessionID,而其他的Session信息則保存在服務器端。在ASP中,客戶端的SessionID實際是以Cookie的形式存儲的。如果用戶在瀏覽器的設置中選擇了禁用Cookie,那末他也就無法享受Session的便利之處了,甚至造成不能訪問某些網站。為了解決以上問題,在ASP.NET中客戶端的Session信息存儲方式分為:Cookie和Cookieless兩種。
     
        ASP.NET中,默認狀態下,在客戶端還是使用Cookie存儲Session信息的。如果我們想在客戶端使用Cookieless的方式存儲Session信息的方法如下:
     
        找到當前Web應用程序的根目錄,打開Web.Config文件,找到如下段落:
     
      <sessionState
        mode="InProc"
        stateConnectionString="tcpip=127.0.0.1:42424"
        sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
        cookieless="false"
        timeout="20"
      />
     
        這段話中的cookieless="false"改為:cookieless="true",這樣,客戶端的Session信息就不再使用Cookie存儲了,而是將其通過URL存儲。關閉當前的IE,打開一個新IE,重新訪問剛才的Web應用程序,就會看到類似下面的樣子:
     
     
        其中,http://localhost/MyTestApplication/(ulqsek45heu3ic2a5zgdl245)/default.aspx中黑體標出的就是客戶端的Session ID。注意,這段信息是由IIS自動加上的,不會影響以前正常的連接。
     
      ASP.NET中服務器端Session狀態的存儲
      準備工作
     
        為了您能更好的體驗到實驗現象,您可以建立一個叫做SessionState.aspx的頁面,然後把以下這些代碼添加到<body></body>中。
     
     
      <scriptrunat="server">
      Sub Session_Add(sender As Object, e As EventArgs)
         Session("MySession") = text1.Value
         span1.InnerHtml = "Session data updated! <P>Your session contains: <font color=red>" &; \
                  Session("MySession").ToString() &; "</font>"
      End Sub
     
      Sub CheckSession(sender As Object, eAs EventArgs)
         If (Session("MySession")Is Nothing) Then
          span1.InnerHtml = "NOTHING, SESSION DATA LOST!"
         Else
          span1.InnerHtml = "Your session contains: <font color=red>" &; \
                   Session("MySession").ToString() &; "</font>"
      End If
      End Sub
      </script>
      <formrunat="server"id="Form2">
         <inputid="text1"type="text"runat="server"name="text1">
         <inputtype="submit"runat="server"OnServerClick="Session_Add"
            value="Add to Session State" id="Submit1"name="Submit1">
         <inputtype="submit"runat="server"OnServerClick="CheckSession"
            value="View Session State" id="Submit2"name="Submit2">
      </form>
      <hrsize="1">
      <fontsize="6"><spanid="span1"runat="server" /></font>
     
        這個SessionState.aspx的頁面可以用來測試在當前的服務器上是否丟失了Session信息。
     
      將服務器Session信息存儲在進程中
        讓我們來回到Web.config文件的剛才那段段落中:
     
      <sessionState
        mode="InProc"
        stateConnectionString="tcpip=127.0.0.1:42424"
        sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
        cookieless="false"
        timeout="20"
      />
        當mode的值是InProc時,說明服務器正在使用這種模式。
     
        這種方式和以前ASP中的模式一樣,就是服務器將Session信息存儲在IIS進程中。當IIS關閉、重起後,這些信息都會丟失。但是這種模式也有自己最大好處,就是性能最高。應為所有的Session信息都存儲在了IIS的進程中,所以IIS能夠很快的訪問到這些信息,這種模式的性能比進程外存儲Session信息或是在SQL Server中存儲Session信息都要快上很多。這種模式也是ASP.NET的默認方式。
     
        好了,現在讓我們做個試驗。打開剛才的SessionState.aspx頁面,隨便輸入一些字符,使其存儲在Session中。然後,讓我們讓IIS重起。注意,並不是使當前的站點停止再開始,而是在IIS中本機的機器名的節點上點擊鼠標右鍵,選擇重新啟動IIS。(想當初使用NT4時,重新啟動IIS必須要重新啟動計算機才行,微軟真是@#$%^&;)返回到SessionState.aspx頁面中,檢查剛才的Session信息,發現信息已經丟失了。
     
      將服務器Session信息存儲在進程外
        首先,讓我們來打開管理工具->服務,找到名為:ASP.NET State Service的服務,啟動它。實際上,這個服務就是啟動一個要保存Session信息的進程。啟動這個服務後,你可以從Windows任務管理器->進程中看到一個名為aspnet_state.exe的進程,這個就是我們保存Session信息的進程。
     
        然後,回到Web.config文件中上述的段落中,將mode的值改為StateServer。保存文件後的重新打開一個IE,打開SessionState.aspx頁面,保存一些信息到Session中。這時,讓我們重起IIS,再回到SessionState.aspx頁面中查看剛才的Session信息,發現沒有丟失。
     
        實際上,這種將Session信息存儲在進程外的方式不光指可以將信息存儲在本機的進程外,還可以將Session信息存儲在其他的服務器的進程中。這時,不光需要將mode的值改為StateServer,還需要在stateConnectionString中配置相應的參數。例如你的計算你是192.168.0.1,你想把Session存儲在IP為192.168.0.2的計算機的進程中,就需要設置成這樣:stateConnectionString="tcpip=192.168.0.2:42424"。當然,不要忘記在192.168.0.2的計算機中裝上.NET Framework,並且啟動ASP.NET State Services服務。
     
      將服務器Session信息存儲在SQL Server中
        首先,還是讓我們來做一些準備工作。啟動SQL Server和SQL Server代理服務。在SQL Server中執行一個叫做InstallSqlState.sql的腳本文件。這個腳本文件將在SQL Server中創建一個用來專門存儲Session信息的數據庫,及一個維護Session信息數據庫的SQL Server代理作業。我們可以在以下路徑中找到那個文件:
     
      [system drive]\winnt\Microsoft.NET\Framework\[version]\
        然後打開查詢分析器,連接到SQL Server服務器,打開剛才的那個文件並且執行。稍等片刻,數據庫及作業就建立好了。這時,你可以打開企業管理器,看到新增了一個叫ASPState的數據庫。但是這個數據庫中只是些存儲過程,沒有用戶表。實際上Session信息是存儲在了tempdb數據庫的ASPStateTempSessions表中的,另外一個ASPStateTempApplications表存儲了ASP中Application對像信息。這兩個表也是剛才的那個腳本建立的。另外查看管理->SQL Server代理->作業,發現也多了一個叫做ASPState_Job_DeleteExpiredSessions的作業,這個作業實際上就是每分鐘去ASPStateTempSessions表中刪除過期的Session信息的。
     
        接著,我們返回到Web.config文件,修改mode的值改為SQLServer。注意,還要同時修改sqlConnectionString的值,格式為:
     
      sqlConnectionString="data source=localhost; Integrated Security=SSPI;"
        其中data source是指SQL Server服務器的IP地址,如果SQL Server與IIS是一台機子,寫127.0.0.1就行了。Integrated Security=SSPI的意思是使用Windows集成身份驗證,這樣,訪問數據庫將以ASP.NET的身份進行,通過如此配置,能夠獲得比使用userid=sa;password=口令的SQL Server驗證方式更好的安全性。當然,如果SQL Server運行於另一台計算機上,你可能會需要通過Active Directory域的方式來維護兩邊驗證的一致性。
     
        同樣,讓我們做個試驗。向SessionState.aspx中添加Session信息,這時發現Session信息已經存在SQL Server中了,即使你重起計算機,剛才的Session信息也不會丟失。現在,你已經完全看見了Session信息到底是什麼樣子的了,而且又是存儲在SQL Server中的,能幹什麼就看你的發揮了,哈哈。
     
      總結
        通過這篇文章,你可以看到在Session的管理和維護上,ASP.NET比ASP有了很大的進步,我們可以更加隨意的挑選適合的方法了。對於企業級的應用來說,這無疑對於服務器的同步、服務器的穩定性、可靠性都是有利的。相信在強大的微軟支持下,新一代的電子商務平台將會搭建的更好!
     
        同時,大家也會發現,在這個整個技術中包括了操作系統、Web服務及數據庫多種技術的整合。我相信,也許Windows沒有Unix穩定,IIS沒有Apache穩定,SQL Server也沒有Oracle強大,但是,誰可以將他們如此完美的聯動到一起呢?所以說,雖然微軟每一方面都不是太強,但是如果把微軟的東西都整合到一起,誰敢說他不強大呢?微軟就是微軟!
    (繼續閱讀...)
    文章標籤

    icejuly 發表在 痞客邦 留言(1) 人氣(30,869)

    • 個人分類:學習系
    ▲top
    • 11月 06 週五 200911:42
    • JavaScript : 判斷瀏覽器種類

    <script language="JavaScript">
        <!--
    function getOs()
    {
        var OsObject = "";
       if(navigator.userAgent.indexOf("MSIE")>0) {
            return "MSIE";
       }
       if(isFirefox=navigator.userAgent.indexOf("Firefox")>0){
            return "Firefox";
       }
       if(isSafari=navigator.userAgent.indexOf("Safari")>0) {
            return "Safari";
       } 
       if(isCamino=navigator.userAgent.indexOf("Camino")>0){
            return "Camino";
       }
       if(isMozilla=navigator.userAgent.indexOf("Gecko/")>0){
            return "Gecko";
       }
      
    }
     alert("您的瀏覽器為:"+getOs());
        -->
    </script>
    (繼續閱讀...)
    文章標籤

    icejuly 發表在 痞客邦 留言(0) 人氣(1,299)

    • 個人分類:學習系
    ▲top
    • 10月 26 週一 200917:22
    • 如何透過IHttpHandler讓某虛擬目錄中檔案(例如Test.txt)必須登入才可瀏覽(或下載)


    如何透過IHttpHandler讓某虛擬目錄中檔案(例如Test.txt)必須登入才可瀏覽(或下載)


    轉載 http://www.dotblogs.com.tw/topcat/archive/2008/03/06/1255.aspx



    我們有時候會有這樣的需求,有些檔案也會希望使用者能夠經過登入驗證後,才能下載使用。然而對於.NET的驗證機制來說,他所保護的是aspx等asp.net的相關檔案,如果您的檔案是【txt文字檔】、【zip壓縮檔】、【doc Word檔】等,這些的檔案只要知道超連結,就可以直接下載。


    那麼有沒有辦法讓這些的檔案也能夠跟aspx一樣,當瀏覽的時候,就檢查看是否有登入系統,如果未登入,就直接倒向到使用者登入畫面,當登入完成後,再進行該檔案的瀏覽或下載。


     




     


    運作原理


        我們知道在aspx的檔案在ASP.NET的驗證機制下,如果輸入ABC.aspx,系統會自動導向到我們指定的登入畫面(例如:Login.aspx),當登入驗證完成後,會再次導向回剛剛想要瀏覽的網頁ABC.aspx。而這些的機制,都是透過.NET Framework的ISAPI 【aspnet_isapi.dll】來處理的。因此我們希望我們指定的副檔名也能夠透過【aspnet_isapi.dll】的處理,做出相同的動作。因此要處理三件事情。



    1. 撰寫IHttpHandler處理這些檔案類型
    2. 設定Web.Config來註冊IHttpHandler,並且設定該資料夾Deny Users="?"
    3. 在IIS中註冊這些副檔名由【aspnet_isapi.dll】處理(這樣才能啟動IHttpHandler)

     




     


    首先要在自己的系統上建立.NET的驗證機制。


    接著,在自己的ASP.NET專案中建立一個資料夾(Files),希望未來存放在此資料夾中的指定檔案格式需要驗證。


    再專案中新增一個類別(Class),命名為CFileSafe.vb,Imports命名空間System.Web
    接著在Class中Implements IHttpHandler,VS自動會產生IsReusable的Property與ProcessRequest的Sub,接著撰寫處理Request的內容,判斷傳入的副檔名,依據不同的副檔名,指定不同的Response.ContentType,相關的程式內容如下:



    1. using System; 
    2. using System.Data; 
    3. using System.Configuration; 
    4. using System.Web; 
    5. using System.Web.Security; 
    6. using System.Web.UI; 
    7. using System.Web.UI.WebControls; 
    8. using System.Web.UI.WebControls.WebParts; 
    9. using System.Web.UI.HtmlControls; 
    10.  
    11. ///  
    12. /// verifyFire 的摘要描述 
    13. ///  
    14. public class verifyFire : IHttpHandler 
    15. { 
    16.  
    17.     public verifyFire() 
    18.     { 
    19.         // 
    20.         // TODO: 在此加入建構函式的程式碼 
    21.         // 
    22.     } 
    23.     bool IHttpHandler.IsReusable 
    24.     { 
    25.         get { throw new Exception("The method or operation is not implemented."); } 
    26.     } 
    27.  
    28.     public void ProcessRequest(HttpContext context) 
    29.     { 
    30.         string FileName = context.Request.FilePath; 
    31.         string[] tmpS = FileName.Split(new Char[] { '.' }); 
    32.         string FileExten = tmpS[tmpS.Rank].ToLower(); 
    33.         bool GetContentType = false; 
    34.         switch (FileExten) 
    35.         { 
    36.             case "txt": 
    37.                 context.Response.ContentType = "text/plain"; 
    38.                 GetContentType = true; 
    39.                 break; 
    40.             case "doc": 
    41.                 context.Response.ContentType = "application/msword"; 
    42.                 GetContentType = true; 
    43.                 break; 
    44.             case "xls": 
    45.                 context.Response.ContentType = "application/ms-excel"; 
    46.                 GetContentType = true; 
    47.                 break; 
    48.             case "ppt": 
    49.                 context.Response.ContentType = "application/vnd.ms-powerpoint"; 
    50.                 GetContentType = true; 
    51.                 break; 
    52.             case "pdf": 
    53.                 context.Response.ContentType = "application/pdf"; 
    54.                 GetContentType = true; 
    55.                 break; 
    56.             case "zip": 
    57.                 context.Response.ContentType = "application/x-zip-compressed"; 
    58.                 GetContentType = true; 
    59.                 break; 
    60.             case "gif": 
    61.                 context.Response.ContentType = "image/gif"; 
    62.                 GetContentType = true; 
    63.                 break; 
    64.  
    65.             case "tif": 
    66.                 context.Response.ContentType = "image/tiff"; 
    67.                 GetContentType = true; 
    68.                 break; 
    69.  
    70.             case "jpg": 
    71.                 context.Response.ContentType = "image/jpeg"; 
    72.                 GetContentType = true; 
    73.                 break; 
    74.  
    75.         } 
    76.         if (GetContentType) 
    77.         { 
    78.             context.Response.TransmitFile(context.Request.FilePath); 
    79.         } 
    80.         //context.Response.Write(FileExten) 
    81.         else 
    82.         { 
    83.             //context.Response.Write(FileExten) 
    84.             context.Response.Write("未設定檔案格式【" + FileExten + "】!!"); 
    85.         } 
    86.     } 
    87. } 

    Imports ...Microsoft.VisualBasic
    Imports System.Web


    Public Class CFileSafe
        Implements IHttpHandler

        Public ReadOnly Property IsReusable() ReadOnly Property IsReusable() As Boolean Implements System.Web.IHttpHandler.IsReusable
            Get

            End Get
        End Property

        Public Sub ProcessRequest() Sub ProcessRequest(ByVal context As System.Web.HttpContext) Implements System.Web.IHttpHandler.ProcessRequest
            Dim FileName As String = context.Request.FilePath
            Dim tmpS() As String
            tmpS = FileName.Split(".")
            Dim FileExten As String = LCase(tmpS(UBound(tmpS)))
            Dim GetContentType As Boolean = False
            Select Case FileExten
                Case "txt"
                    context.Response.ContentType = "text/plain"
                    GetContentType = True
                Case "doc"
                    context.Response.ContentType = "application/msword"
                    GetContentType = True
                Case "xls"
                    context.Response.ContentType = "application/ms-excel"
                    GetContentType = True
                Case "ppt"
                    context.Response.ContentType = "application/vnd.ms-powerpoint"
                    GetContentType = True
                Case "pdf"
                    context.Response.ContentType = "application/pdf"
                    GetContentType = True
                Case "zip"
                    context.Response.ContentType = "application/x-zip-compressed"
                    GetContentType = True
                Case "gif"
                    context.Response.ContentType = "image/gif"
                    GetContentType = True

                Case "tif"
                    context.Response.ContentType = "image/tiff"
                    GetContentType = True

                Case "jpg"
                    context.Response.ContentType = "image/jpeg"
                    GetContentType = True

            End Select
            If GetContentType Then
                context.Response.TransmitFile(context.Request.FilePath)
                'context.Response.Write(FileExten)
            Else
                'context.Response.Write(FileExten)
                context.Response.Write("未設定檔案格式【" & FileExten & "】!!")
            End If

        End Sub

    End Class

     

    接著要針對此資料夾(Files)增加一個Web.config來註冊IHttpHandler,順便指定此資料夾不允許未登入使用者存取
    <?xml version="1.0" encoding="utf-8"?>
    <!-- 注意: 除了手動編輯這個檔案以外,您也可以使用 Web 管理工具
         設定您的應用程式設定值。請使用 Visual Studio 中的  
         [網站] -> [ASP.NET 組態] 選項。
         如需完整的設定與註解清單,請參考 machine.config.comments (通常
         位於 \Windows\Microsoft.NET\Framework\v2.0.xxxxx\Config)
    -->
    <configuration>
        <appSettings/>
        <connectionStrings/>
        <system.web>
          <httpHandlers>
            <add verb="*" path="*.*" type="CFileSafe"/>
          </httpHandlers>
          <authorization>
            <deny users="?"/>
          </authorization>
        </system.web>
    </configuration>

    程式的部分就到此為止,接著就可以放些測試的檔案到此資料夾中,並且拉出超連結到Login.aspx中,方便測試登入的驗證。


    此時執行Login.aspx,點選超鏈結到Test.txt,卻發現還是沒有要求登入就直接顯示?原因是我們還少了最後的一個步驟→設定這些檔案格式給ISAPI處理


    開啟IIS,瀏覽到我們ASP.NET應用程式中的Files資料夾,點選滑鼠右鍵→內容。
    當我們要設定ISAPI的時候發現,由於他不是個應用程式,所以無法針對Files設定ISAPI


     此時我們可以先暫時把該資料夾建立為應用程式,讓他可以設定,等設定完成後再把應用程式移除即可。


    接著進入設定,來看看副檔名aspx的設定為何??


    將處理aspx的aspnet_isapi.dll路徑複製下來,等一下用相同的檔案來處理我們要處理的副檔名


    接著新增一個副檔名的處理,我們舉txt來當作範例




    接著把其他的副檔名用相同的方式設定,這個部份的畫面就省略了。


    最後,Files其實不是個應用程式所以記得把應用程式移除


     




     


    經過以上的設定後,再來測試看看就會發現,當瀏覽Files下的Test.txt的時候,系統會自動導向到Login.aspx要求登入,登入完成後,自動再導回Test.txt的內容進行瀏覽。接著測試zip也一樣,在未登入的狀況下,會要求使用者進行登入,登入完成後,就會出現下載儲存的對話方塊。

    (繼續閱讀...)
    文章標籤

    icejuly 發表在 痞客邦 留言(0) 人氣(663)

    • 個人分類:學習系
    ▲top
    • 10月 25 週日 200900:23
    • 關於權限設計的探討(轉載的)

    關於權限設計的探討    
       
       
      但凡涉及多用戶不同權限的網絡或者單機程序,都會有權限管理的問題,比較突出的是MIS系統。    
       
      下面我要說的是MIS系統權限管理的數據庫設計及實現,當然,這些思路也可以推廣開來應用,比如說在BBS中用來管理不同級別的用戶權限。    
       
      權限設計通常包括數據庫設計、應用程序接口(API)設計、程序實現三個部分。    
       
      這三個部分相互依存,密不可分,要實現完善的權限管理體系,必須考慮到每一個環節可行性與複雜程度甚至執行效率。    
       
      我們將權限分類,首先是針對數據存取的權限,通常有錄入、瀏覽、修改、刪除四種,其次是功能,它可以包括例如統計等所有非直接數據存取操作,另外,我們還可能對一些關鍵數據表某些字段的存取進行限制。除此,我想不出還有另外種類的權限類別。    
       
      完善的權限設計應該具有充分的可擴展性,也就是說,系統增加了新的其它功能不應該對整個權限管理體繫帶來較大的變化,要達到這個目的,首先是數據庫設計合理,其次是應用程序接口規範。    
       
      我們先討論數據庫設計。通常我們使用關係數據庫,這裡不討論基於Lotus產品的權限管理。    
       
      權限表及相關內容大體可以用六個表來描述,如下:    
      1   角色(即用戶組)表:包括三個字段,ID,角色名,對該角色的描述;    
      2   用戶表:包括三個或以上字段,ID,用戶名,對該用戶的描述,其它(如地址、電話等信息);    
      3   角色-用戶對應表:該表記錄用戶與角色之間的對應關係,一個用戶可以隸屬於多個角色,一個角色組也可擁有多個用戶。包括三個字段,ID,角色ID,用戶ID;    
      4   限制內容列表:該表記錄所有需要加以權限區分限制的數據表、功能和字段等內容及其描述,包括三個字段,ID,名稱,描述;    
      5   權限列表:該表記錄所有要加以控制的權限,如錄入、修改、刪除、執行等,也包括三個字段,ID,名稱,描述;    
      6   權限-角色-用戶對應表:一般情況下,我們對角色/用戶所擁有的權限做如下規定,角色擁有明令允許的權限,其它一律禁止,用戶繼承所屬角色的全部權限,在此範圍內的權限除明令禁止外全部允許,範圍外權限除明令允許外全部禁止。該表的設計是權限管理的重點,設計的思路也很多,可以說各有千秋,不能生搬硬套說某種方法好。對此,我的看法是就個人情況,找自己覺得合適能解決問題的用。    
       
      先說第一種也是最容易理解的方法,設計五個字段:ID,限制內容ID,權限ID,角色/用戶類型(布爾型字段,用來描述一條記錄記錄的是角色權限還是用戶權限),角色/用戶ID,權限類型(布爾型字段,用來描述一條記錄表示允許還是禁止)    
       
      好了,有這六個表,根據表六,我們就可以知道某個角色/用戶到底擁有/禁止某種權限。    
       
      或者說,這麼設計已經足夠了,我們完全實現了所需要的功能:可以對角色和用戶分別進行權限定制,也具有相當的可擴展性,比如說增加了新功能,我們只需要添加一條或者幾條記錄就可以,同時應用程序接口也無須改動,具有相當的可行性。但是,在程序實現的過程中,我們發現,使用這種方法並不是十分科學,例如瀏覽某個用戶所擁有的權限時,需要對數據庫進行多次(甚至是遞歸)查詢,極不方便。於是我們需要想其它的辦法。使用過Unix系統的人們都知道,Unix文件系統將對文件的操作權限分為三種:讀、寫和執行,分別用1、2、4三個代碼標識,對用戶同時具有讀寫權限的文件被記錄為3,即1+2。我們也可以用類似的辦法來解決這個問題。初步的想法是修改權限列表,加入一個字段:標識碼,例如,我們可以將錄入權限標識為1,瀏覽權限標識為2,修改權限標識為4,刪除權限標識為8,執行權限標識為16,這樣,我們通過權限累加的辦法就可以輕易的將原本要分為幾條記錄描述的權限放在一起了,例如,假定某用戶ID為1,庫存表對應的限制內容ID為2,同時規定角色類型為0、用戶類型為1,我們就可以將該用戶具有錄入、瀏覽、修改、刪除庫存表的權限描述為:2,15,1,1。    
       
      確實很簡單,不是嗎?甚至還有更過激的辦法,將限制內容列表也加上一列,定義好標識碼,這樣,我們甚至可以用簡單的一條記錄描述某個用戶具有的對全部內容所具有的全部權限了。當然,這樣做的前提是限制內容數量比較小,不然,呵呵,2的n次方遞增起來可是數量驚人,不容易解析的。    
       
      從表面上看,上述方法足以達到實現功能、簡化數據庫設計及實現的複雜度這個目的,但這樣做有個弊端,我們所涉及的權限列表不是相互獨立而是互相依賴的,比如說修改權限,其實是包含瀏覽權限的,例如,我們可能只是簡單的設置用戶對庫存表存取的權限值為錄入+修改+刪除(1+4+8=13),但事實上,該用戶具有(1+2+4+8=15)的權限,也就是說,在這種方案中,13=15。於是當我們調用API詢問某用戶是否具有瀏覽權限時,就必須判斷該用戶是否具有對該數據表的修改權限,因此,如果不能在程序中固化權限之間的包含關係,就不能利用應用程序接口簡單的做出判斷。但這與我們的目的「充分的可擴展性」矛盾。    
       
      這個問題如何解決?我想到了另外一種設置標識碼的方法,那就是利用素數。我們不妨將錄入、瀏覽、修改、刪除、執行的基本標誌碼定為2,3,5,7,11,當遇到權限互相包含的時候,我們將它的標識碼設定為兩個(或多個)基本標誌碼的乘積,例如,可以將「修改」功能的標誌碼定為3*5=15,然後將所有的權限相乘,就得到了我們需要的最終權限標識值。這樣,我們在詢問用戶是否具有某項權限的時候,只需要將最終的值分解成質因子,例如,我們可以定義一個用戶具有錄入+修改+刪除庫存表的權限為   2*15*7=2*3*5*7,即表示,該用戶具有了對庫存表錄入+瀏覽+修改+刪除權限。    
       
      當然,對權限列表我們使用上述方法的前提是權限列表記錄條數不會太多並且關係不是十分複雜,否則,光是解析權限代碼就要機器忽悠半宿:)    
       
      我希望以上的分析是正確且有效的(事實上,我也用這些的方法在不止一套系統中實現),但無論如何,我覺得如此實現權限管理,只是考慮了數據庫設計和應用程序接口兩部分內容,對於實現,還是顯得很費勁。因此,我懇請有過類似設計、實現經驗的同志們提出建設性的意見和修改建議。  
    (繼續閱讀...)
    文章標籤

    icejuly 發表在 痞客邦 留言(0) 人氣(2,916)

    • 個人分類:學習系
    ▲top
    • 10月 25 週日 200900:21
    • UrlRewrite有什麼用處?

    轉載:http://blog.csdn.net/alex197963/archive/2009/06/04/4241844.aspx
     
    UrlRewrite有什麼用處?
    1、滿足搜索引擎的要求
    某些搜索引擎不能支持動態頁面的抓取,大量的信息就不能被潛在用戶搜索到。用UrlRewrite技術你可以把 http://server/news.asp?id=111 變成 http://server/news/111.htm 這樣他們就會被搜索引擎收錄了。google雖然可以抓取動態頁面,但是google對動態頁面的評分一般低於靜態頁面。所以,對大量信息發佈的網站,把網站地址改變成靜態的絕對是值得的。
    2、隱藏技術實現,提高網站的移植性
    每個頁面都掛著鮮明的.asp/.jsp這種開發語言的標記,可以一眼讓人看出你的網站使用什麼語言做的。而且在改變網站的語言的時候,你需要改動大量的鏈接。而且,一個頁面修改了擴展名,他的pagerank也會隨之消失,從頭開始。我們可以用UrlRewrite技術隱藏我們的實現細節,這樣修改移植都很方便,而且完全不損失pagerank。
    3、滿足美感的要求
    對於追求完美主義的網站設計師,即使是網頁的地址也要看起來簡潔明快。形如 http://server/news.asp?channel=3&id=111 的網頁地址,肯定是上不了完美主義者的法眼的,用UrlRewrite技術,你可以把他變成 http://server/news/3/111.htm 。
    1.下載ISAPI_Rewrite.ISAPI_Rewrite分精簡(Lite)和完全(Full)版.精簡版不支持對每個虛擬主機站點進行重寫,只能進行全局處理.不過對於有服務器的朋友,精簡版也就夠啦.精簡版下載地址:http://www.helicontech.com/download/ ,就是
    ISAPI_Rewrite 3 Lite Freeware!
    read on specific limitations
    (也可以自己選擇合適的了)
    2.安裝.msi的文件,和裝一般程序一樣裝就可以了,俺裝在D:\Program Files\Helicon\ISAPI_Rewrite3\ .
    3.接下來一步比較重要哦。打開Internet 信息服務,右鍵web站點屬性,點ISAPI篩選器選項卡.添加篩選器,名稱自己填,路逕自己指定ISAPI_Rewrite.dll,然後確定。 (這裡如果iis是6.0且ISAPI_Rewrite是 高版本的話安裝的時候軟件會自動添加上去,並且還會在web站點屬性裡添加一個ISAPI_Rewrite選項卡。而低版本的要手動添加了)(哈哈我的是高版本的 )
    4.來測試一下.新建一個test.asp,裡面寫上
    <%=request.querystring("info")%>
    效果就是執行的時候test.asp?info=自己手動輸入的內容(頁面會得到並顯示)
    5.這一步很重要哦,開始添加rewrite規則(即RewriteRule)
    打開Internet 信息服務,右鍵web站點屬性,點ISAPI_Rewrite 選項卡, 打開編輯(Edit).將下面代碼複製上去保存
    (我們要把test.asp?info=hello映射成為test-hello.html這樣的類型),
    RewriteRule /test-([0-9,a-z]*).html /test.asp\?info =$1
    點擊應用然後保存
    6.到瀏覽器裡查看一下效果吧.輸入http://localhost/test.asp?info=hello 和http://localhost/test-hello.html ,顯示的內容是不是都是hello ?這就證明成功啦!(如果不行可以重啟iis再試下)
    注:這種方式我修改服務器的配置(沒有自己的服務器就沒辦法了),下面推薦一種新的方法(用代碼實現)!
    方法二:使用HttpModule實現URL重寫
    利用ASP.NET提供的HttpContext.RewritePath方法。這個方法允許開發人員動態地重寫收到的URL的處理路徑,然後讓ASP.NET使用剛重寫過後的路徑來繼續執行請求。 譬如,我們可以選擇向大眾呈示下列URL:
    http://www.store.com/products/Books.aspx
    http://www.store.com/products/DVDs.aspx
    http://www.store.com/products/CDs.aspx
    在外界看來,網站上有三個單獨的網頁(對搜索爬蟲而言,這看上去很棒)。通過使用 HttpContext的RewritePath方法,我們可以在這些請求剛進入服務器時,動態地把收到的URL重寫成單個Products.aspx網頁接受一個查詢字符串的類別名稱或者PathInfo參數。譬如,我們可以使用Global.asax中的 Application_BeginRequest事件,來這麼做:
        void Application_BeginRequest( object sender, EventArgs e) {
    string fullOrigionalpath = Request.Url.ToString() ;
             if (fullOrigionalpath.Contains( "/Products/Books.aspx" )) {
                 Context.RewritePath( "/Products.aspx?Category=Books" ) ;
    }
    else if (fullOrigionalpath.Contains( "/Products/DVDs.aspx" )) {
                 Context.RewritePath( "/Products.aspx?Category=DVDs" ) ;
    }
         }
    手工編寫象上面這樣的編碼的壞處是,很枯燥乏味,而且容易犯錯。我建議你別自己寫,而是使用網上現成的HttpModule來完成這項工作。這有幾個你現在就可以下載和使用的免費的HttpModule:
       UrlRewriter.net
       UrlRewriting.net
       這些模塊允許你用聲明的方式在你應用的web.config文件裡表達匹配規則。譬如,在你應用的web.config文件裡使用 UrlRewriter.Net模塊來把上面的那些URL映射到單個Products.aspx頁上,我們只要把這個web.config文件添加到我們的應用裡去就可以了(不用任何編碼):
      
      
       <?xml version="1.0"?>
      
       <configuration>
      
       <configSections>
       <section name="rewriter" requirePermission="false"     type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter" />
       </configSections>
      
       <system.web>
      
       <httpModules>
       <add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter"/>
       </httpModules>
      
       </system.web>
      
       <rewriter>
       <rewrite url="~/products/books.aspx" to="~/products.aspx?category=books" />
       <rewrite url="~/products/CDs.aspx" to="~/products.aspx?category=CDs" />
       <rewrite url="~/products/DVDs.aspx" to="~/products.aspx?category=DVDs" />
       </rewriter>
      
       </configuration>
      
       上面的HttpModule URL重寫模塊還支持正則表達式和URL模式匹配(以避免你在web.config 文件裡硬寫每個URL)。所以,不用寫死類別名稱,你可以像下面這樣重寫匹配規則,把類別名稱動態地從任何/products/[類別].aspx組合的 URL裡取出來:
      
      
       <rewriter>
       <rewrite COLOR: red">aspx" to="~/products.aspx?category=$1" />
       </rewriter>
      
      
       這使得你的編碼極其乾淨,並且擴展性非常之好。
    樣例下載
    注意:(1)一些圖片、css路徑要注意
    (2)上傳到服務器時不要忘了上傳web.config
    (3)如果要重寫html,這個要在IIS裡配置一下就是把處理的html文件,轉交到asp.net來處理!
    (繼續閱讀...)
    文章標籤

    icejuly 發表在 痞客邦 留言(0) 人氣(748)

    • 個人分類:學習系
    ▲top
    • 10月 23 週五 200910:47
    • 事件觸發

    1.建立 Delegate
    2.建立 Event
    3.在要啟動事件的地方, 註冊事件處理常式
    4.運行會觸發事件的 method
    5.在會觸發事件的 method中,要檢查
    /////////////////////////////
    //建立事件,觸發他
                    if (GetInfoEvent != null)
                    {
                        //給予事件所註冊的method ,參數
                        GetInfoEvent(i, total);
                    }
    ////////////////////////////////////////
     
    using System;
    using System.Windows.Forms;
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            public delegate void CountChangeHandler(string total);
            // The event we publish 
            public event CountChangeHandler CountChangEvent;
          
            void Form1_CountChang(string total)
            {
                System.Threading.Thread.Sleep(1000);
                Console.WriteLine(total);
          
            }
            private void button1_Click(object sender, EventArgs e)
            {
                CountChangEvent += new CountChangeHandler(Form1_CountChang);
                _1AddTo10();
            }
            public int _1AddTo10()
            {
                int total = 0;
                for (int i = 1; i <= 10; i++)
                {
                    total = total + i;
                    //建立事件,觸發他
                    if (CountChangEvent != null)
                    {
                        //給予事件所註冊的method ,參數
                        CountChangEvent(total.ToString());
                    }
                }
                return total;
            }
           
        }
    }
    (繼續閱讀...)
    文章標籤

    icejuly 發表在 痞客邦 留言(0) 人氣(66)

    • 個人分類:學習系
    ▲top
    • 10月 23 週五 200900:28
    • AJAX 下,阻止按鈕連續觸發

    01 <script runat="server">
    02 protected void Button_Handler(object sender, EventArgs e)
    03 {
    04 // some long-processing operation.
    05 }
    06 </script>
    07 <div>
    08 <asp:ScriptManager ID="defaultScriptManager"
    09 runat="server" />
    10
    11 <asp:UpdatePanel ID="defaultPanel"
    12 UpdateMode="Conditional" runat="server">
    13 <ContentTemplate>
    14 <!-- more content here -->
    15 <asp:Button ID="btnSubmit" runat="server"
    16 Text="Submit" OnClick="Button_Handler" />
    17 </ContentTemplate>
    18 </asp:UpdatePanel>
    19 </div>
    You plan to create a client-side script code by using ASP.NET AJAX.
    You need to ensure that while a request is being processed, any subsequent Click events on the btnSubmit Button control are suppressed.
    Which code fragment should you insert at line 10?
     
     
    <script type="text/javascript" language="javascript">
    var rm = Sys.WebForms.PageRequestManager.getInstance();
    rm.add_initializeRequest(checkPostback);
    function checkPostback(sender, args) {
      if (rm.get_isInAsyncPostBack() && args.get_postBackElement().id == 'btnSubmit') {
        args.set_cancel(true);
        alert('A previous request is still in progress.');
      }
    }
    </script>
    (繼續閱讀...)
    文章標籤

    icejuly 發表在 痞客邦 留言(0) 人氣(284)

    • 個人分類:學習系
    ▲top
    • 9月 30 週三 200910:11
    • HttpModule與HttpHandler詳解(轉載)


    轉載


    http://hi.baidu.com/zeratul_bb/blog/item/54db48d9bde028e138012f74.html


     


    ASP.NET對請求處理的過程:
    當請求一個*.aspx文件的時候,這個請求會被inetinfo.exe進程截獲,它判斷文件的後綴(aspx)之後,將這個請求轉交給 ASPNET_ISAPI.dll,ASPNET_ISAPI.dll會通過http管道(Http PipeLine)將請求發送給ASPNET_WP.exe進程,在ASPNET_WP.exe進程中通過HttpRuntime來處理這個請求,處理完畢將結果返回客戶端。
        inetinfo.exe
    進程:是www服務的進程,IIS服務和ASPNET_ISAPI.DLL都寄存在此進程中。
        ASPNET_ISAPI.DLL
    :是處理.aspx文件的win32組件。其實IIS服務器是只能識別.html文件的,當IIS服務器發現被請求的文件是.aspx文件時,IIS服務器將其交給aspnet_isapi.dll來處理。
        aspnet_wp.exe
    進程:ASP.NET框架進程,提供.net運行的托管環境,.net的CLR(公共語言運行時)就是寄存在此進程中。


    ASP.NET Framework處理一個Http Request的流程:
        HttpRequest-->inetinfo.exe-->ASPNET_ISAPI.dll-->ASPNET_WP.exe-->HttpRuntime-->HttpApplication Factory-->HttpApplication-->HttpModule-->HttpHandler Factory-->HttpHandler-->HttpHandler.ProcessRequest()
    ASP.NET
    請求處理過程是基於管道模型的,這個管道模型是由多個HttpModule和HttpHandler組成,ASP.NET 把http請求依次傳遞給管道中各個HttpModule,最終被HttpHandler處理,處理完成後,再次經過管道中的HTTP模塊,把結果返回給客戶端。我們可以在每個HttpModule中都可以干預請求的處理過程。




    注意:在http請求的處理過程中,只能調用一個HttpHandler,但可以調用多個HttpModule。
    當請求到達HttpModule的時候,系統還沒有對這個請求真正處理,但是我們可以在這個請求傳遞到處理中心(HttpHandler)之前附加一些其 它信息,或者截獲的這個請求並作一些額外的工作,也或者終止請求等。在HttpHandler處理完請求之後,我們可以再在相應的HttpModule中把請求處理的結果進行再次加工返回客戶端。


    HttpModule
        HTTP
    模塊是實現了System.Web.IhttpModule接口的類。
        IHttpModule
    接口的聲明:
            public interface IHttpModule
            {
                void Init (HttpApplication context);
                void Dispose ();
            }
            Init
    方法:系統初始化的時候自動調用,這個方法允許HTTP模塊向HttpApplication 對像中的事件註冊自己的事件處理程序。
            Dispose方法:這個方法給予HTTP模塊在對像被垃圾收集之前執行清理的機會。此方法一般無需編寫代碼。
       
        HTTP
    模塊可以向System.Web.HttpApplication對像註冊下面一系列事件:
            AcquireRequestState
    當ASP.NET運行時準備好接收當前HTTP請求的對話狀態的時候引發這個事件。
            AuthenticateRequest
    當ASP.NET 運行時準備驗證用戶身份的時候引發這個事件。

            AuthorizeRequest
    當ASP.NET運行時準備授權用戶訪問資源的時候引發這個事件。

            BeginRequest
    當ASP.NET運行時接收到新的HTTP請求的時候引發這個事件。

            Disposed
    當ASP.NET完成HTTP請求的處理過程時引發這個事件。

            EndRequest
    把響應內容發送到客戶端之前引發這個事件。

            Error
    在處理HTTP請求的過程中出現未處理異常的時候引發這個事件。

            PostRequestHandlerExecute
    在HTTP處理程序結束執行的時候引發這個事件。

            PreRequestHandlerExecute
    在ASP.NET開始執行HTTP請求的處理程序之前引發這個事件。在這個事件之後,ASP.NET 把該請求轉發給適當的HTTP處理程序。

            PreSendRequestContent
    在ASP.NET把響應內容發送到客戶端之前引發這個事件。這個事件允許我們在內容到達客戶端之前改變響應內容。我們可以使用這個事件給頁面輸出添加用於所有頁面的內容。例如通用菜單、頭信息或腳信息。

            PreSendRequestHeaders
    在ASP.NET把HTTP響應頭信息發送給客戶端之前引發這個事件。在頭信息到達客戶端之前,這個事件允許我們改變它的內容。我們可以使用這個事件在頭信息中添加cookie和自定義數據。

            ReleaseRequestState
    當ASP.NET結束所搜有的請求處理程序執行的時候引發這個事件。

            ResolveRequestCache
    我們引發這個事件來決定是否可以使用從輸出緩衝返回的內容來結束請求。這依賴於Web應用程序的輸出緩衝時怎樣設置的。

            UpdateRequestCache
    當ASP.NET完成了當前的HTTP請求的處理,並且輸出內容已經準備好添加給輸出緩衝的時候,引發這個事件。這依賴於Web應用程序的輸出緩衝是如何設置的。


        上面這麼多的事件,我們看起來可能會有些眼暈,但沒關係,下面一步一步地看。
        HttpModule
    生命週期示意圖




       
    下面是事件的觸發順序:




        BeginRequest
    和PreRequestHandlerExecute之間的事件是在服務器執行HttpHandler處理之前觸發。
        PostRequestHandlerExecute
    和PreSendRequestContent之間的事件是在服務器執行Handler處理之後觸發。
       
       
    下面我們看一下如何使用HttpModule來實現我們日常的應用:
            HttpModule
    通過在某些事件中註冊,把自己插入ASP.NET請求處理管道。當這些事件發生的時候,ASP.NET調用對相應的HTTP模塊,這樣該模塊就能處理請求了。
           1
    、向每個頁面動態添加一些備註或說明性的文字:
                有的網站每一個頁面都會彈出一個廣告或在每個頁面都以註釋形式(<!-- -->)加入網站的版權信息。如果在每個頁面教編寫這樣的JS代碼的話,對於大一點的網站,這種JS代碼的編寫與維護可是一個很繁瑣枯燥的工作。
               
    有了HttpModule我們就可以很簡單地解決這個問題了。HttpModule是客戶端發出請求到客戶端接收到服務器響應之間的一段必經之路。我們完全可以在服務器處理完請求之後,並在向客戶端發送響應文本之前這段時機,把這段註釋文字添加到頁面文本之後。這樣,每一個頁面請求都會被附加上這段註釋文 字。
               
    這段代碼究竟該在哪個事件裡實現呢? PostRequestHandlerExecute和PreSendRequestContent之間的任何一個事件都可以,但我比較喜歡在EndRequest事件裡編寫代碼。
               
    第一步:創建一個類庫ClassLibrary831。
               
    第二步:編寫一個類實現IHttpModule接口
                   
    class TestModule:IHttpModule
                    {
                        public void Dispose()
                        {
                        }
                        public void Init(HttpApplication context)
                        {
                        }
                    }
               
    第三步:在Init事件中註冊EndRequest事件,並實現事件處理方法
                  
    class TestModule:IHttpModule
                    {
                        public void Dispose(){}
                        public void Init(HttpApplication context)
                        {
                           
    context.EndRequest += new EventHandler(context_EndRequest);
                        }
                       
    void context_EndRequest(object sender, EventArgs e)
                        {
                            HttpApplication ha = (HttpApplication)sender;
                            ha.Response.Write("<!--
    這是每個頁面都會動態生成的文字。--grayworm-->");
                        }
                    }
                第四步:在Web.Conofig中註冊一下這個HttpModule模塊
              
    <httpModules>
              
    <add name="TestModule" type="ClassLibrary831.TestModule,ClassLibrary831"></add>
              </httpModules>
              name:模塊名稱,一般是類名

              type
    :有兩部分組成,前半部分是命名空間和類名組成的全名,後半部分是程序集名稱,如果類是直接放在App_Code文件夾中,那程序名稱是App_Code。
                   
    這樣在Web站點是添加該類庫的引用後,運行每個頁面,會發現其源文件中都會加入「<!--這是每個頁面都會動態生成的文字。--grayworm-->」這句話。同樣的方法你也可以在其中加入JS代碼。
           2
    、身份檢查
                大家在作登錄時,登錄成功後,一般要把用戶名放在Session中保存,在其它每一個頁面的Page_Load事件中都檢查Session中是否存在用戶名,如果不存在就說明用戶未登錄,就不讓其訪問其中的內容。
               
    在比較大的程序中,這種做法實在是太笨拙,因為你幾乎要在每一個頁面中都加入檢測Session的代碼,導致難以開發和維護。下面我們看看如何使用HttpModule來減少我們的工作量
               
    由於在這裡我們要用到Session中的內容,我們只能在AcquireRequestState和PreRequestHandlerExecute事 件中編寫代碼,因為在HttpModule中只有這兩事件中可以訪問Session。這裡我們選擇PreRequestHandlerExecute事件編寫代碼。
               
    第一步:創建一個類庫ClassLibrary831。
               
    第二步:編寫一個類實現IHttpModule接口
                   
    class TestModule:IHttpModule
                    {
                        public void Dispose()
                        {
                        }
                        public void Init(HttpApplication context)
                        {
                        }
                    }
               
    第三步:在Init事件中註冊PreRequestHandlerExecute事件,並實現事件處理方法
                  
    class AuthenticModule:IHttpModule
                    {
                        public void Dispose(){}
                        public void Init(HttpApplication context)
                        {
                           
    context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);
                        }
                       
    void context_PreRequestHandlerExecute(object sender, EventArgs e)
                        {
                            HttpApplication ha = (HttpApplication)sender;
                            string path = ha.Context.Request.Url.ToString();
                            int n = path.ToLower().IndexOf("Login.aspx");
                            if (n == -1) //
    是否是登錄頁面,不是登錄頁面的話則進入{}
                            {
                                if (ha.Context.Session["user"] == null) //
    是否Session中有用戶名,若是空的話,轉向登錄頁。

                                {
                                    ha.Context.Response.Redirect("Login.aspx?source=" + path);
                                }
                            }
                        }
                    }
                第四步:在Login.aspx頁面的「登錄」按鈕中加入下面代碼
                   
    protected void Button1_Click(object sender, EventArgs e)
                    {
                        if(true)    //
    判斷用戶名密碼是否正確
                        {
                            if (Request.QueryString["source"] != null)
                            {
                                string s = Request.QueryString["source"].ToLower().ToString();   //
    取出從哪個頁面轉來的
                                Session["user"] = txtUID.Text;
                                Response.Redirect(s); //
    轉到用戶想去的頁面
                            }
                            else
                            {
                                Response.Redirect("main.aspx");    //
    默認轉向main.aspx
                            }
                        }
                    }
                第五步:在Web.Conofig中註冊一下這個HttpModule模塊
              
    <httpModules>
               <add name="TestModule" type="ClassLibrary831.TestModule,ClassLibrary831"></add>
              </httpModules>
           3、多模塊的操作

               
    如果定義了多個HttpModule,在web.config文件中引入自定義HttpModule的順序就決定了多個自定義HttpModule在處理一個HTTP請求的接管順序。

                



    HttpHandler
        HttpHandler
    是HTTP請求的處理中心,真正地對客戶端請求的服務器頁面做出編譯和執行,並將處理過後的信息附加在HTTP請求信息流中再次返回到HttpModule中。
        HttpHandler
    與HttpModule不同,一旦定義了自己的HttpHandler類,那麼它對系統的HttpHandler的關係將是「覆蓋」關係。
        IHttpHandler
    接口聲明
        public interface IHttpHandler
        {
            bool IsReusable { get; }
            public void ProcessRequest(HttpContext context); //
    請求處理函數
        }
       
       
    示例:把硬盤上的圖片以流的方式寫在頁面上

            class TestHandler : IHttpHandler
            {
               
    public void ProcessRequest(HttpContext context)
                {
                    FileStream fs = new FileStream(context.Server.MapPath("worm.jpg"), FileMode.Open);
                    byte[] b = new byte[fs.Length];
                    fs.Read(b, 0, (int)fs.Length);
                    fs.Close();
                    context.Response.OutputStream.Write(b, 0, b.Length);
                }
                public bool IsReusable
                {
                    get
                    {
                        return true;
                    }
                }
            }
            Web.Config
    配置文件
          <httpHandlers>
           <add verb="*" path="*" type="ClassLibrary831.TestHandler,ClassLibrary831"></add>
          </httpHandlers>
               Verb
    屬性:指定了處理程序支持的HTTP動作。*-支持所有的HTTP動作;「GET」-支持Get操作;「POST」-支持Post操作;「GET, POST」-支持兩種操作。
    Path
    屬性:指定了需要調用處理程序的路徑和文件名(可以包含通配符)。「*」、「*.aspx」、「showImage.aspx」、「test1.aspx,test2.aspx」

    Type
    屬性:用名字空間、類名稱和程序集名稱的組合形式指定處理程序或處理程序工廠的實際類型。ASP.NET運行時首先搜索bin目錄中的DLL,接著在GAC中搜索。
           
    這樣程序運行的效果是該網站的任何一個頁面都會顯示worm.jpg圖片。如何只讓一個頁面(default21.aspx)執行HttpHandler 中的ProcessRequest方法呢?最簡單的辦法是在Web.Config文件中把path配置信息設為default21.aspx。

           
    根據這個例子大家可以考慮一下如何編寫「驗證碼」了。


    IHttpHandler工廠
        IHttpHandlerFactory
    的作用是對IHttpHandler進行管理。工廠的作用請見http://hi.baidu.com/grayworm/blog/item/4a832160f8c9de46eaf8f8c1.html"
        IHttpHandlerFactory
    接口的聲明:
            public interface IHttpHandlerFactory
            {
                IHttpHandler GetHandler (HttpContext context,string requestType,string url,string pathTranslated);
                void ReleaseHandler (IHttpHandler handler);
            }
           GetHandler
    返回實現IHttpHandler接口的類的實例,ReleaseHandler使工廠可以重用現有的處理程序實例。
       
    示例:兩個用IHttpHandlerFactory來實現對不同HttpHandler的調用。

       
    有兩個HttpHandler:將圖片顯示在頁面上的HttpHandler和生成驗證碼的Handler
            //
    將圖片顯示在頁面上的
    Handler
           
    class TestHandler : IHttpHandler
            {
                public void ProcessRequest(HttpContext context)
                {
                    FileStream fs = new FileStream(context.Server.MapPath("worm.jpg"), FileMode.Open);
                    byte[] b = new byte[fs.Length];
                    fs.Read(b, 0, (int)fs.Length);
                    fs.Close();
                    context.Response.OutputStream.Write(b, 0, b.Length);
                }
                public bool IsReusable
                {
                    get
                    {
                        return true;
                    }
                }
            }
            //
    生成驗證碼的Handler
           
    class CodeHandler:IHttpHandler
            {
                public bool IsReusable
                {
                    get
                    {
                        return true;
                    }
                }
                public void ProcessRequest(HttpContext context)
                {
                    Image b = new Bitmap(50,20);
                    Graphics g = Graphics.FromImage(b);
                    SolidBrush sb = new SolidBrush(Color.White);
                    Font f = new Font("
    宋體", 12);
                    string str = "";
                    Random r = new Random();
                    for (int i = 0; i < 4; i++)
                    {
                        str += r.Next(10);
                    }
                    g.DrawString(str,f,sb,0,0);
                    b.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
                }
            }
             IHttpHandler工廠
             class TestHandlerFactory : IHttpHandlerFactory
             {
                public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
                {
                   
                    string fname = url.Substring(url.IndexOf('/') + 1);
                    while (fname.IndexOf('/') != -1)
                        fname = fname.Substring(fname.IndexOf('/') + 1);
                    string cname = fname.Substring(0, fname.IndexOf('.'));
                    string className ="";


                    className = "ClassLibrary831.CodeHandler";
                    object h = null;
                    try
                    {
                        //h = new TestHandler();
                        h = Activator.CreateInstance(Type.GetType(className));
                    }
                    catch (Exception e)
                    {
                        throw new HttpException("
    工廠不能為類型" + cname + "創建實例。", e);
                    }
                    return (IHttpHandler)h;
                }
                public void ReleaseHandler(IHttpHandler handler)
                {
                }
             }
    (車延祿)
            配置文件
        <httpHandlers>
        <add verb="*" path="default21.aspx,default22.aspx" type="ClassLibrary831.TestHandlerFactory,ClassLibrary831"></add>
       </httpHandlers>

      
    這樣TestHandlerFactory就會根據請求的不同頁面執行不同的HttpHandler處理程序了。


    HttpHandler使用會話
       
    如果要在處理程序中使用Session,那必須把該HttpHandler實現IRequiresSessionState接口,,IRequiresSessionState接口是個空接口,它沒有抽像方法,只是一個標記。此處就不作例子驗證了。


     

    (繼續閱讀...)
    文章標籤

    icejuly 發表在 痞客邦 留言(0) 人氣(7,560)

    • 個人分類:學習系
    ▲top
    12...4»

    自訂側欄

    自訂側欄

    遊樂新香港

    弦子

    小賈斯汀音樂貼紙

    fasio

    熱門文章

    • (282,871)製造業中常用的英文縮寫
    • (30,869)[ASP.NET]Session詳解 (轉載)
    • (663)如何透過IHttpHandler讓某虛擬目錄中檔案(例如Test.txt)必須登入才可瀏覽(或下載)
    • (7,560)HttpModule與HttpHandler詳解(轉載)
    • (46,346)C#日期函數使用大全
    • (1,353)VBScript 中單引號、雙引號的問題

    文章分類

    • 旅行 (1)
    • 電腦和網際網路 (1)
    • 學習系 (29)
    • 未分類文章 (1)

    最新文章

    • 製造業中常用的英文縮寫
    • 使用HttpWebRequest 登入網站並POST查詢‏
    • [ASP.NET]Session詳解 (轉載)
    • JavaScript : 判斷瀏覽器種類
    • 如何透過IHttpHandler讓某虛擬目錄中檔案(例如Test.txt)必須登入才可瀏覽(或下載)
    • 關於權限設計的探討(轉載的)
    • UrlRewrite有什麼用處?
    • 事件觸發
    • AJAX 下,阻止按鈕連續觸發
    • HttpModule與HttpHandler詳解(轉載)

    文章精選

    文章搜尋

    誰來我家

    參觀人氣

    • 本日人氣:
    • 累積人氣: