Microsoft Word - adv_ch06.doc

Similar documents
گروه ا موزشي فرزان نمونه ايي از كتاب الكترونيكي ا موزش Forefront TMG

Microsoft Word - paziresh.doc

Microsoft Word - Help_ docx

Stored Proceure_Trigger

Microsoft Word - servise sarpaei .doc

Microsoft Word - cash.doc

Microsoft Word - ins.doc

یک روش کنترلی جدید برای اتصال مبدل های فتوولتائیک به شبکه سراسری

DFT (Discrete Fourier Transform) ۱ تبدیل Z یا تبدیل فوریه x[n] که به صورت X(z) و ) jω X(e نمایش داده می شوند از لحاظ محاسباتی دو مشکل دارند: ۱ -محاسبه

راهنماي استفاده از تي ودوليت هاي الكترونيكي سريDT200 ساخت كمپانيFOIF مدير عامل : مهندس مهدي برومند ترجمه و تنظيم : مهندس سودابه عارفي راد آدرس : تهران

Microsoft Word - AT(2)(2)(2)(2).doc

Microsoft PowerPoint خط تاثير [Compatibility Mode]

Microsoft PowerPoint - paper_elm_2410.ppt [Compatibility Mode]

untitled

0259.doc

Microsoft Word - طیف سنجی مادون قرمز.docx

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

abs.indd

Slide 1

Microsoft Word - توزيع درامد درخانوارهاي شهري و روستایی

untitled


Microsoft Word - Maharathaye Sokhanrani Lithography.doc

Microsoft PowerPoint - همايش ايزوله

Microsoft PowerPoint - Darvish_Slides[1].ppt

final report 93 - Copy

untitled

D _01 FARSI

Microsoft PowerPoint - Mrs Helali nasab.ppt

Microsoft PowerPoint - chapter 5.pptx

n n معین نامنفی است زیرا: H H x A Ax Ax ,, 2, n نشان دهیم و قرار دهیم H A A یک ماتریس 1 1, 2 2,, n n 1 2 n نامیده می شوند و اگر A Ax Ax 1

第一章 章标题-F2 上空24,下空24

untitled

PG User Guide

Microsoft PowerPoint - principle1.pptx

<4D F736F F D2032E4DCDEDCDCC7D4DCDCED20CFEDDCCCDCDCDCEDDCCADCC7E12E646F6378>

مشروعیت مجلس خبرگان - مصطفی جعفر پیشه فرد

بسم الله الرحمن الرحیم

Report-Monit-F2

REPORT ID: SS-220D COMPILED BY: HONG KONG HOUSING SOCIETY 香港房屋協會 PROJECT:THS2018 HONG KONG HOUSING SOCIETY 香港房屋協會 T-HOME TRANSITIONAL RENTAL HOUSING S

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

untitled

Microsoft Word - template.doc

ASP.NET实现下拉框二级联动组件

منابع امتحانات نهايي فوق تخصصي سال ۱۳۹۲ اخلاق پزشكي براي همه رشته ها كتب: پزشك و ملاحظات اخلاقي جلد اول :مروري بر مباني اخلاق پزشكي / تاليف دكتر باقر

<ADB6ADB1C25EA8FAA6DB2D4D56432E706466>

Microsoft Word - Heat ransfer_Outline_Section 7_New

Microsoft Word - 0

1 Internet [1]P Web Service Web Service Web XML HTTP URL 1..NET Framework.NET Framework Web Service HTTP 80.NET Framework 2

untitled

EJB-Programming-3.PDF

Microsoft PowerPoint - ch6 [相容模式]

基于ECO的UML模型驱动的数据库应用开发1.doc

مجله پژوهشهاي به زراعي جلد 5 شماره 3 پاييز 1392 ج ه و ش ی زرا ی تا ثير كاربرد كود دامي و نيتروژن بر عملكرد و اجزاي عملكرد گياه دارويي هميشه بهار (.L (

mvc

untitled

Telegram Web زهره 9:47:01 PM جشنواره توليدمحتوای الکترونيکی مجتمع سوده 4/21/ apk.

Chapter 2

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

一 個 SQL Injection 實 例 的 啟 示 頁 2 / 6 因 此, 在 知 名 網 站 上 看 到 SQL Injection, 讓 人 驚 心, 卻 不 意 外 網 站 專 案 外 包 是 目 前 業 界 的 常 態, 而 在 價 格 取 勝 的 制 度 下, 低 價 得 標 的 S

概述

ch_code_infoaccess

EJB-Programming-4-cn.doc

نوجوان ساله کيست ؟

A Preliminary Implementation of Linux Kernel Virus and Process Hiding

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

epub83-1

0.72 TELE-satellite World Download this report in other languages from the Internet: Arabic العربية

untitled

2 WF 1 T I P WF WF WF WF WF WF WF WF 2.1 WF WF WF WF WF WF

epub 61-2

untitled

6-1 Table Column Data Type Row Record 1. DBMS 2. DBMS MySQL Microsoft Access SQL Server Oracle 3. ODBC SQL 1. Structured Query Language 2. IBM

چسب وخمیرسیلیکون--رزین ها

untitled

بسمه تعالي كتابچه خلاصه مقالات همايش بين المللي تحول پايدار در نظام سلامت رويكردها و چالش ها 5 تا 7 اسفند 1393 دانشگاه علوم پزشكي اصفهان دبير علمي هما

دستور زبان سوم راهنمائی

Chn 116 Neh.d.01.nis

Microsoft Word - ch04三校.doc

INTRODUCTION TO COM.DOC

1 الکترونیک عناصر از نظر هدایت الکتریکی به سه دسته تقسیم میشوند: فصل اول» نیمههادي و دیودها «1) هادي 2) نیمه هادي 3) عایق در ساختمان اتمی تمامی عناصر

سال هاي دهه 90 را مي توان زمان تكامل و بهره وري چدن نشكن آستمپر دانست

untitled

RunPC2_.doc

untitled

<4D F736F F D20E620DBE4F820DAE4CFE1EDC820C7E1C8E5C7C1>

59 1 CSpace 2 CSpace CSpace URL CSpace 1 CSpace URL 2 Lucene 3 ID 4 ID Web 1. 2 CSpace LireSolr 3 LireSolr 3 Web LireSolr ID

Basic System Administration

untitled

ebook140-9

untitled

06-4.indd

PowerPoint Presentation

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

حکومت علوی ، هدف ها و مسؤولیت ها / گروهی از نویسندگان ، تهیه فصلنامه حکومت اسلامی - قم : دبیرخانه مجلس خبرگان ، 1381

新・解きながら学ぶJava

FA10302 ژوئن 2015 حق نسخهبرداری 2015.ASUSTeK Computer Inc تمامی حقوق محفوظ است. هیچ بخشی از این دفترچه راهنما )به غیر از مستنداتی که توسط خریدار و برا

untitled

ASP.NET MVC Visual Studio MVC MVC 範例 1-1 建立第一個 MVC 專案 Visual Studio MVC step 01 Visual Studio Web ASP.NET Web (.NET Framework) step 02 C:\M

ebook 132-6

Transcription:

فصل ششم : بكار گيري global.asax و بحثهاي ا ماري سايت مقدمه : يكي از فايلهايي كه همواره توسط VS.NET به صورت خودكار ايجاد مي شود global.asax است و براي تعريف اشياء عمومي كه برنامه ي وب از ا نها استفاده مي كند بكار مي رود. از اين فايل براي مديريت پردازش هايي در سطوح بالاتر برنامه مانند Application_Start و Application_End وغيره استفاده مي شود. اين فايل در مرورگر وب توسط ساير كاربران قابل اجرا و مشاهده نيست. لازم به ذكر است كه استفاده از اين فايل اختياري بوده و در صورت نياز از ا ن استفاده مي شود. شرح رخدادهاي تعريف شده درون : global.asax : Application_Init اين رويداد هر بار كه يك شيءجديد از HttpApplication ساخته مي شود اجرا مي گردد. كدهاي ا غاز گر را مي توان در اين قسمت تعريف كرد. : Application_Disposed اين رويداد درست قبل از تخريب هر شيء ايجاد شده از HttpApplication فراخواني مي گردد. عموما از ا ن براي پاكسازي منابع تخصيص داده شده استفاده مي گردد. 1 استاد دوره : وحيد نصيري

: Application_Error هنگاميكه خطايي مديريت نشده رخ مي دهد اين رويداد فراخواني مي گردد. : Application_Start اين رخداد تنها يكبار در طول عمر برنامه ي وب اتفاق مي افتد و ا ن هنگامي است كه اولين شيء HttpApplication ساخته مي شود. از اين رخداد براي براي به اشتراك گذاشتن يك شيء در بين تمام سشن ها استفاده مي شود. در اين رخداد متغييرهاي محلي را تعريف نكنيد زيرا متغيرهاي محلي بين اشياء HttpApplication به اشتراك گذاشته نمي شوند. : Application_End اين رخداد تنها يكبار ا نهم هنگاميكه ا خرين شيء HttpApplication تخريب مي شود اتفاق مي افتد. از اين رخداد براي پاكسازي اشياء به اشتراك گذاشته شده مي توان استفاده كرد. : Application_BeginRequest اين رخداد اولين رخدادي است كه ASP.NET هنگاميكه به يك درخواست پاسخ مي دهد اتفاق مي افتد. : Application_EndRequest اين رخداد ا خرين رخدادي است كه ASP.NET هنگاميكه به يك درخواست پاسخ مي دهد اتفاق مي افتد. : Application_PreRequestHandlerExecute اين رخداد درست قبل از اجراي يك اداره كننده (Handler) مانند صفحه يا web service رخ مي دهد. در اين زمان سشن مهيا شده است. : Application_PostRequestHandlerExecute اين رخداد زماني اتفاق مي افتد كه يك اداره كننده اجرايش خاتمه مي يابد. 2 استاد دوره : وحيد نصيري

: Application_PreSendRequestHeader اين رخداد درست قبل از فرستاده شدن HttpHeaders به كلاينت ها رخ مي دهد. : Application_PreSendRequestContext اين رخداد درست قبل از اينكه ASP.NET محتويات صفحه را به كلاينت ها بفرستد رخ مي دهد. : Application_AcquireRequestState اين رخداد هنگامي اتفاق مي افتد كه ASP.NET وضعيت جاري را ذخيره مي كند (مانند وضعيت سشن مربوط به درخواست جاري). : Application_ReleaseRequestState اين رخداد هنگامي اتفاق مي افتد كه ASP.NET اجراي تمامي اداره كننده هاي درخواست ها را تمام كرده است. اين رخداد سبب مي شود كه ماژولهاي حالت داده هاي وضعيت جاري را ذخيره كنند. : Application_ResolveRequestCache اين رخداد هنگامي اتفاق مي افتد كه ASP.NET رخداد تعيين اعتبار را تمام كرده است و اجازه مي دهد به ماژولهاي caching تا اجراي اداره كننده ها را متوقف كرده و خود اراي ه ي سرويس نمايند. اين مورد سبب بالارفتن كارا يي سايت مي گردد و مي توان با استفاده از ا ن قضاوت كرد كه ا يا محتويات از Cache خوانده مي شوند يا خير : Application_UpdateRequestCache اين رخداد هنگامي اتفاق مي افتد ASP.NET اجراي يك اداره كننده را تمام مي كند و به ماژولهاي Caching اجازه مي دهد تا مواردي را كه بايد در درخواست هاي بعدي از Cache خوانده شوند ذخيره كنند. 3 استاد دوره : وحيد نصيري

: Application_AuthenticationRequest است. اين رخداد هنگامي رخ مي دهد كه ماژول امنيتي مشخص مشخص كرده است كه كاربر جاري معتبر : Application_AuthorizeRequest اين رخداد هنگامي رخ مي دهد كه ماژول امنيتي مشخص كرده است كه كاربر تعيين اعتبار شده مجوز دسترسي به منابع را دارد يا خير : Session_Start اين رخداد هر بار كه يك كاربر جديد به وب سايت دسترسي پيدا مي كند فراخواني مي گردد. : SessionEnd اين رخداد هنگاميكه سشن يك كاربر زمانش تمام مي شود و يا خاتمه مي يابد فراخواني مي گردد. ترتيب رويدادن رخدادهاي ذكر شده در سطح : Application - BeginRequest - AuthenticateRequest - AuthorizeRequest - ResolveRequestCache - AcquireRequestState - PreRequestHandlerExecute - PreSendRequestHeaders - PreSendRequestContent - (actual processing) - PostRequestHandlerExecute - ReleaseRequestState - UpdateRequestCache - EndRequest 4 استاد دوره : وحيد نصيري

اين ترتيبي است كه رويدادهاي نامبرده شده يكي پس از ديگري اتفاق مي افتند. منشاء ا نها شيء HttpApplication و يا شيء HttpModule است كه در Web.Config و يا Machine.Config تعيين مي شوند. مثال : ۱ يك پروژه جديد وب اپليكيشن را ا غاز نماييد و سپس كد زير را در فايل global.asax ا ن بنويسيد: using System; using System.Collections; using System.ComponentModel; using System.Web; using System.Web.SessionState; namespace ex01 /// <summary> /// Summary description for Global. /// </summary> public class Global : System.Web.HttpApplication public Global() InitializeComponent(); protected void Application_Start(Object sender, EventArgs e) Application["Hits"] = 0; Application["Sessions"] = 0; Application["TerminatedSessions"] = 0; protected void Session_Start(Object sender, EventArgs e) Application.Lock(); Application["Sessions"] = (int) Application["Sessions"] + 1; Application.UnLock(); //The BeginRequest event is fired for every hit to every page in the site protected void Application_BeginRequest(Object sender, EventArgs e) Application.Lock(); Application["Hits"] = (int) Application["Hits"] + 1; Application.UnLock(); 5 استاد دوره : وحيد نصيري

protected void Application_EndRequest(Object sender, EventArgs e) protected void Application_AuthenticateRequest(Object sender, EventArgs e) protected void Application_Error(Object sender, EventArgs e) protected void Session_End(Object sender, EventArgs e) Application.Lock(); Application["TerminatedSessions"] = (int) Application["TerminatedSessions"] + 1; Application.UnLock(); protected void Application_End(Object sender, EventArgs e) //Write out our statistics to a log file //...code omitted... #region Web Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() #endregion اكنون در رويداد page_load وب فرم كد زير را براي نمايش ا مار سايت بنويسيد: private void Page_Load(object sender, System.EventArgs e) Response.Write("<h2> Statistics for the Test Web Application </h2>"); Response.Write(" Total hits: "); Response.Write(Application["Hits"].ToString()); Response.Write("<br> Total sessions:"); Response.Write(Application["Sessions"].ToString()); Response.Write("<br> Expired sessions:"); 6 استاد دوره : وحيد نصيري

Response.Write(Application["TerminatedSessions"].ToString()); كد فوق رخدادهايي را كه تاكنون بررسي كرده ايم را به شكلي عملي نمايش مي دهد. همانطور كه پيش تر نيز ذكر شد BeginRequest هر بار كه صفحه مشاهده مي شود اتفاق مي افتد و از ا ن براي نوشتن Hit Counter ها مي توان استفاده نمود. هنگاميكه صفحه اجرا شد ا نرا چندبار ريفرش كنيد تا نتيجه را ملاحظه نماييد. براي اينكه چيزي شبيه به قسمت line? Who is on را كه در اكثر فوروم ها مي توان مشاهده كرد ايجاد نماييم مي توان از Session_Start و End استفاده كرد. با استفاده از اين رخدادها مي توان دريافت كه چه نوع كاربران متفاوتي به سايت رجوع كرده اند. با كمي توسعه ي كد فوق مي توان بحث هاي ا ماري جالبي را درسايت پديد ا ورد. شكل ۱ نمايي از اجراي برنامه ي نمايش دهنده ي ا مار سايت. 7 استاد دوره : وحيد نصيري

نكته : اگر فايل global.asax تغيير كند برنامه ي وب Restart خواهد شد و تمام مقادير ذخيره شده ي ا ن صفر خواهند شد. اضافه كردن اشياء به فايل : Global.asax براي اين منظور كلاسي ساده را اضافه مي كنيم كه رشته ها را دريافت و ذخيره كند. از شيء Application براي اينكار مي خواهيم استفاده نماييم بنابراين كلاس بايد Thread-safe باشد. معناي Thread-Safe اين است كه تعداد زيادي از كلاينت ها مي توانند به كلاس بدون تخريب داده هاي ا ن دسترسي داشته باشند. از ا نجاي يكه ASP.NET يك Thread را به ازاي هر صفحه بكار مي برد اطمينان حاصل كردن از Thread-safe بودن كلاس اگر چندين كاربر در يك زمان به سايت مراجعه نمايند بسيار مهم و بحراني است. براي اطمينان حاصل كردن از اين امر از روش Synchrinozation (همزماني) استفاده مي شود كه مربوط است به كلاس. Hashtable مثال ۲: يك پروژه ي وب اپليكيشن جديد را ا غاز نماييد. سپس از منوي پروژه يك كلاس جديد به نام MyClass را به برنامه اضافه نموده و كد زير را در ا ن بنويسيد. using System; using System.Collections; // for Hashtable namespace ex02 /// <summary> /// Summary description for MyClass. /// </summary> public class MyClass private Hashtable m_col; 8 استاد دوره : وحيد نصيري

//m_colsync will be a thread-safe container for m_col private Hashtable m_colsync; public MyClass() m_col = new Hashtable(); m_colsync = Hashtable.Synchronized(m_col); public void AddItem(String Name, String Value) m_colsync[name] = Value; public String GetItem(String Name) return (String) m_colsync[name]; سپس كد زير را به فايل global.asax اضافه نماييد: protected void Application_Start(Object sender, EventArgs e) MyClass m_var = new MyClass(); m_var.additem("firstuser", "Vahid"); Application["myVar"]=m_var; حوضه ي ديد يك شيء در اين فايل مي تواند Session Application و يا AppInstance باشد. در حالتي كه حوضه ي ديد AppInstance باشد فقط به يك نمونه از HttpApplication مربوط شده و به اشتراك گذاشته نمي شود. متغير هاي تعريف شده توسط شيء Session فقط براي يك كاربر در طول سشن او معتبر هستند و متغيرهاي تعريف شده توسط شيء Application در دسترس تمام كاربران سايت مي باشد. صفحه ي وب زير از اين شيء استفاده مي كند: private void Page_Load(object sender, System.EventArgs e) MyClass m_var = new MyClass(); m_var = (MyClass) Application["myVar"]; Response.Write(m_var.GetItem("FirstUser")); 9 استاد دوره : وحيد نصيري

مثال ۳: بهترين مكان براي نوشته شدن يك سري از رخدادهاي برنامه در Event log سيستم (شخصي) است و يا سروري كه دسترسي به يك سري از منابع ا ن براي شما تعريف شده است. براي اين منظور يك پروژه ي وب اپليكيشن جديد را ا غاز كرده و سپس به كد زير دقت فرماييد: using System; using System.Collections; using System.ComponentModel; using System.Web; using System.Web.SessionState; using System.Diagnostics; namespace ex03 /// <summary> /// Summary description for Global. /// </summary> public class Global : System.Web.HttpApplication public Global() InitializeComponent(); protected void Application_Start(Object sender, EventArgs e) EventLog.WriteEntry("Sample Application", "Application Started!", EventLogEntryType.Information); protected void Session_Start(Object sender, EventArgs e) Session.Contents.Add("TimeStart", DateTime.Now); protected void Application_Error(Object sender, EventArgs e) EventLog.WriteEntry("Sample Application", "Application Error Occured!", EventLogEntryType.Error); protected void Application_End(Object sender, EventArgs e) EventLog.WriteEntry("Sample Application", "Application Ended!", EventLogEntryType.Warning); #region Web Form Designer generated code 10 استاد دوره : وحيد نصيري

/// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() #endregion شكل ۲- مواردي را كه تاكنون در برنامه و در Global.asax بكار برديم مي توان در Clipbiard Ring جعبه ابزار استاندارد VS.NET نيز مشاهده نمود. 11 استاد دوره : وحيد نصيري

ممكن است بار اول در هنگام اجراي كد فوق با خطاي زير مواجه شويد كه به تنظيمات امنيتي سيستم مربوط مي گردد: Security Exception Description: The application attempted to perform an operation not allowed by the security policy. To grant this application the required permission please contact your system administrator or change the application's trust level in the configuration file. Exception Details: System.Security.SecurityException: Requested registry access is not allowed. شكل ۳- براي مشاهده ي رخدادهاي ثبت شده مي توان به Server explorer مراجعه نمود و قسمت Event logs را بررسي كرد. اضافه كردن رخدادهاي سفارشي به : global.asax علاوه بر رخدادهاي تعريف شده و استاندارهاي فوق ما نيز مي توانيم رخدادهايي را براي فايل global.asax تعريف كنيم. اينكار از طريق HttpModule به صورت زير انجام مي شود: 12 استاد دوره : وحيد نصيري

مثال : ۴ پروژه ي وب اپليكيشن جديدي را ا غاز نموده و سپس يك كلاس جديد به ا ن به نام SyncModule.cs اضافه نماييد. محتويات اين كلاس به صورت زير است: using System; using System.Web; namespace ex04 public class SyncModule : IHttpModule public delegate void MyEventHandler(Object s, EventArgs e); private MyEventHandler _eventhandler = null; public SyncModule() public void Init(HttpApplication app) app.beginrequest += new EventHandler(OnBeginRequest); public void Dispose() public event MyEventHandler MyEvent add _eventhandler += value; remove _eventhandler -= value; public void OnBeginRequest(Object s, EventArgs e) HttpApplication app = s as HttpApplication; app.context.response.write( "Hello from OnBeginRequest in custom module.<br>"); if(_eventhandler!=null) _eventhandler(this, null); در ادامه كد زير را در رخداد Page_Load مربوط به وب فرم بنويسيد: 13 استاد دوره : وحيد نصيري

private void Page_Load(object sender, System.EventArgs e) Response.Write("Hello from Test.aspx.<br>"); سپس فايل وب كانفيگ را در برنامه گشوده و كد زير را به ا ن اضافه نماييد: <httpmodules> < "add name="mymodule" type="ex04.syncmodule, ex04/> </httpmodules> فايل global.asax را گشوده و كد زير را در ا ن بنويسيد: protected void MyModule_OnMyEvent(Object src, EventArgs e) Context.Response.Write( "Hello from MyModule_OnMyEvent called in Global.asax.<br>"); برنامه را اجرا نماييد. استفاده از Context در : Global.asax به صورت پيش فرض اشياء Request Response و Page تعريف شده در كلاس HttpApplication در فايل global.asax قابل دستيابي نيستند. از Context براي اين منظور استفاده مي شود. مثال ۵: يك پروژه ي وب اپليكيشن جديد را ا غاز نماييد و سپس كد زير را در فايل Global.asax ا ن بنويسيد: protected void Application_Start(Object sender, EventArgs e) Application["SessionCounter"]=0; 14 استاد دوره : وحيد نصيري

protected void Session_Start(Object sender, EventArgs e) /// Fires when the session is started Application.Lock(); Application["SessionCounter"] = (int)application["sessioncounter"]+1; Application.UnLock(); Context.Response.Write("No of session(s): "+Application["SessionCounter"]); 15 استاد دوره : وحيد نصيري

تمرين: ۱- يك Hit Counter را با ديتابيس اكسس طراحي نماييد. ۲- بر مبناي اطلاعات از ۵ دقيقه پيش تا كنون يوزر كنترلي را طراحي كنيد كه كاربران وارد شده به سايت را نمايش دهد. 16 استاد دوره : وحيد نصيري