Programming

Single Sign On - Sharing Session State

posted on 19 Aug 2013 17:36 by inwprogramming in Programming

Session Model (C#.net)

ที่มีอยู่ 5 Mode ครับ

1. InProc mode เป็นโหมดที่ทำงานโดยเก็บข้อมูลไว้ใน RAM ของ Web Server ซึ่งเป็นโหมดพื้นฐานที่ตั้งค่ามาให้ใช้งาน

ข้อดี ง่ายและเป็นโหมดที่ทำงานได้เร็วทีสุด

ข้อเสีย แต่มีข้อจำกัดในการรองรับจำนวนข้อมูลและการแชร์ session ใน Farm และเมื่อ web server restart ทุกอย่างที่เก็บไว้ก็จะหายไปทันที

 

2. StateServer (OutProc) mode เป็น โหมดที่ทำงานโดยแยก Service ที่เป็นส่วนเสริมของ ASP.NET เองออกไปจาก IIS process ซึ่งมีชื่อว่า ASP.NET state service โดยจะมีติดตั้งให้ทันทีที่ลง .NET Framework ซึ่งจะอยู่ที่“systemroot\Microsoft.NET\Framework\versionNumber\aspnet_state.exe”

ข้อดี ด้วย ตัว state server นี้แม้หากว่า web server เกิด restart ตัวเองขึ้นมาคุณก็แน่ใจได้ว่าเซสชั่นนั้นยังคงถูกเก็บไว้อยู่แน่นอน ซึ่งเหมาะที่จะใช้สำหรับ Web Server ใน Farm และมีความเร็วในการทำงานเป็นลำดับรองจาก InProc Mode อยู่ 1 เท่าตัว

ข้อเสีย คือ กิน RAM เหมือน InProc เพราะเก็บไว้ใน RAM เหมือนกับ InProc mode เพียงแต่แยก service ออกมาต่างหาก แปลว่าคุณควรจะมีเครื่องแยกออกมาและมีช่องเสียบ RAM เยอะๆ และเสียบ RAM ไว้เพื่อรองรับงานดังกล่าว แต่เมื่อ StateServer restart ทุกเซสชั่นก็จะหายไปหมดเช่นกัน

ตัวอย่าง web.config

<configuration>
  <system.web>
    <sessionState mode="StateServer"stateConnectionString="tcpip=SampleStateServer:42424" 
                  cookieless="false" timeout="20"/>
  </system.web>
</configuration>

 

 

 

3. SQLServer mode เป็นโหมดที่เก็บเซสชั่นไว้ใน Database

ข้อดี คุณสมบัติ เหมือนกับ StateServer mode ทุกอย่าง และถึงแม้ว่า SqlServer จะ restart ข้อมูลเซสชั่นก็ยังคงถูกเก็บเอาไว้ใน Database ไม่หายไป และดีกว่าที่ว่าสามารถขยายความจุของเซสชั่นได้เท่ากับพื้นที่บน HDD ที่มีอยู่ เหมาะที่ใช้กับ Web Server ใน Farm

ข้อเสียที่ว่า ช้ากว่า InProc mode ประมาณ 3 เท่าตัว

ตัวอย่าง web.config

<configuration>
  <system.web>
    <sessionState mode="SQLServer" sqlConnectionString=
                  "Integrated Security=SSPI;data source=SQLSessionServer;" />
  </system.web>
</configuration>

 

 

*** หากต้องการจะใช้งาน SqlServer Mode คุณต้องทำการ register database ด้วย aspnet_regsql.exe ตัวนี้ก่อน

4. Custom mode หา ตัวอื่นมาใช้ทดแทนทั้ง 3 mode ที่กล่าวไปข้างต้น โดยอาจจะเก็บไว้ใน Disk, NoSql เป็นต้น ซึ่งเราจะมาพูดคุยและทดสอบใช้งานกันในตอนนี้

5. Off mode ไม่ใช้ Session (ฟังดูจะโหดร้ายไปหน่อย)

Sharing sessions across applications using the ASP.NET Session State Service

Single Sign On เมื่อเราเข้าใจเรื่องราวเกี่ยวกับ Session แล้วต่อไปต้อง ทำ Session ให้เข้าใจว่าเป็นตัวเดียวกัน(ใช้ได้เฉพาะโหมด SQLServer mode เท่านั้น)

Basically the idea is both apps use native .net sessionState stored in sqlserver. By using the same machine key and making a small tweak to a stored procedure – both apps can share any session keys and/or forms authenication.

- แก้ตรง Application Name ให้เหมือนกัน

Both apps would do something like this in there web.config:

<sessionState mode="SQLServer" 
sqlConnectionString
="Data Source=.\SQLEXPRESS;User Id=test;Password=test;
Application Name=AppName"
/> <machineKey validationKey="SOMEKEY" validation="SHA1" decryption="AES" />

 

Session state db would need to be set up on a database server, that both apps can see.

Docs for doing this: http://msdn.microsoft.com/en-us/library/ms229862(VS.80).aspx

Command that would need to be run: C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin>aspnet_regsql.exe -E -ssadd --sstype p -S .\SQLEXPRESS

-แก้ Stroed procedure โดยใส่ค่านี้ลงไป

Stored procedure (TempGetAppID) tweak to:

 @appId int OUTPUT
AS

    -- start change

    -- Use the application name specified in the connection for the appname if specified
    -- This allows us to share session between sites just by making sure they have the
    -- the same application name in the connection string.
    DECLARE @connStrAppName nvarchar(50)
    SET @connStrAppName = APP_NAME()

    -- .NET SQLClient Data Provider is the default application name for .NET apps
    IF (@connStrAppName <> '.NET SQLClient Data Provider')
        SET @appName = @connStrAppName

    -- end change

SET @appName = LOWER(@appName)

 

 


enter image description here

เท่านี้ก็เรียบร้อยแล้ว

Cr. http://greatfriends.biz/webboards/msg.asp?id=130514  ,

http://stackoverflow.com/questions/2868316/sharing-sessions-across-applications-using-the-asp-net-session-state-service
เรียนรู้วิธีการสร้าง HTML Application ต่างกับ  Exe Application อย่างไร 
            วันนี้ผมมีวิธีการเขียนโปรแกรมอีกแบบนะครับที่นอกเหนือจากการเขียนโปรแกรม แบบ PHP หรือ C# หรือ VB.net นะครับ การเขียนโปรแกรมอีกรูปแบบที่ว่านี้ก็คือ HTML Application หรือว่าเรียกสั่นๆ ว่า HTA นั่นเองครับ มาดูกันก่อนเลยนะครับว่า HTA คืออะไร HTA นี้ก็คือ Microsoft Windows Program ที่ซึ่งหุ้มตัว Source code ที่ประกอบไปด้วย HTML และภาษา Script เช่น VBScript, C#Script หรือ JavaScript

            จริงๆ แล้วเราอาจกล่าวได้ว่า HTML นั่นเอาไว้เพื่อสร้างหน้าตาของโปรแกรม หรือว่า GUI นั่นเอง ส่วนภาษา Script นั่นก็เอาไว้จัดการเกี่ยวกับ Logic คุณคงสงสัยแล้วใช่มั้ยครับว่าเขียนด้วย HTML ยังงั้นเราก็ต้องใช้การแสดงผลใน Internet Explorer สิ ไม่เลยครับตัวโปรแกรม HTA นี้สามารถทำงานได้โดยไม่ต้องการ Internet Explorer สักนิดเดียวครับ จริงๆ แล้วจะพูกให้ถูกตัวมันเองก็เป็นเหมือน Windows Application นั่นเละครับ เรารู้คร่าวๆ เกี่ยวกับ HTA แล้วนะครับเรามาเริ่มสร้าง Application ง่ายๆ กันดีกว่าครับ โปรแกรมที่ผมจะสร้างขึ้นมาก็ง่ายๆ ครับเพียงแค่มีปุ่มเมื่อกดจะเปิดโปรแกรม Notepad ขึ้นมานั่นเองครับ

  • เขียนโปรแกรม HTML ลงในไฟล์ test_hta.hta ดังนี้
  • จากนั่นเราจะได้ไฟล์โปรแกรมตามนี้นะครับ
  • เมื่อเรารันโปรแกรมแล้วหน้าตาจะได้ตามด้านล่างครับ โดยไม่ต้องใช้ Internet Explorer เลย
  • เมื่อเราคลิ๊กปุ่มโปรแกรม Notepad ก็จะถูกเปิดมานะครับ
เห็นมั้ยครับว่าเพียงแค่นี้เราก็เขียนโปรแกรมให้ออกมาได้สวยงามเหมือน HTML แล้วครับรันได้ทุกที่โดยไม่ต้องมี Internet Explorer เพียงแค่มี Windows ก็พอครับ ส่วนเรื่องการเขียนโปรแกรมนั่นเราก็ใช้ภาษา Script เอาซึ่งตัว Script เองก็สามารถทำงานได้เหมือนกับที่เราเขียน C# หรือ VB นั่นเลยครับ

edit @ 22 Aug 2012 09:20:52 by P.Tongkamonwat

โครงสร้างโปรแกรม (Coding)

posted on 14 Aug 2012 23:35 by inwprogramming in Programming
โครงสร้างโปรแกรม 
หลายๆ คนสงสัยว่า 
if...else
1)     if (expression) {
statement ;
}  else  {
statement ;
}
2)     if (expression) 
{
statement ;
}
else 
{
statement ;
}
แบบไหนดูง่ายกว่ากัน
จริงๆ ผมว่าแบบ 2) ดูง่ายน่ะครับ
แบบ 1) ส่วนมากจะเจอในภาษา PHP
ส่วน C#.net นิยมเขียนแบบ 2) เพราะว่า
ถ้าพิมพ์ Code แบบ 1) ไป C#.net จะจัด Format ให้อยู่ในรูปแบบที่ 2 ครับ

edit @ 14 Aug 2012 23:49:39 by P.Tongkamonwat

Object Oriented Programming(OOP)

posted on 12 Aug 2012 19:40 by inwprogramming in Programming

OOP ไม่ใช่ภาษา ไม่ใช่ซอฟท์แวร์ มันเป็นเพียง Paradigm (อ่านว่า พาราดิม แปลว่า แบบ หรือตัวอย่าง) หรือ สไตล์การเขียน มันยังเป็นวิธีคิดอีกด้วย หากนักเขียนโค้ดยังคิดแบบ non-OOP แม้จะใช้ซอฟท์แวร์หรือใช้ภาษา OOP อย่างดี โค้ดผลลัพธ์ก็จะไม่เป็น OOP ไปได้

OOP เป็นส่วนหนึ่งของวิชาวิศวกรรมซอฟท์แวร์ วิชานี้มีขึ้นเพื่อยกระดับการสร้างซอฟท์แวร์ให้เป็นไปตามหลักวิศวกรรม เพราะเดิมการเขียนโค้ดเป็นเรื่องของความสามารถเฉพาะตัว นักเขียนโปรแกรมแต่ละคนใช้หลักการเฉพาะตน ทำให้การสร้างซอฟท์แวร์มีความเป็นศิลปะมากกว่าศาสตร์ พฤติกรรมเช่นนี้เป็นปัจจัยหนึ่งซึ่งทำให้เกิดสภาพการณ์ที่เรียกว่า วิกฤตกาลซอฟท์แวร์ (Software crisis) ตอนปลายทศวรรษ 1960 เป็นวิกฤตกาลด้านความขาดแคลนซอฟท์แวร์ที่มีประสิทธิภาพ

ปัจจัยสำคัญอีกอย่าง ที่ทำให้วิกฤตกาลซอฟท์แวร์รุนแรงขึ้น คือการเกิดขึ้นของไมโครโปรเซสเซอร์ในช่วงกลางทศวรรษ 1970 และการพัฒนาฮาร์ดแวร์ที่ก้าวหน้าอย่างรวดเร็ว เนื่องจากฮาร์ดแวร์สามารถถูกผลิตขึ้นได้จำนวนมาก โดยทำเป็นอุตสาหกรรม ในขณะที่ไม่อาจทำเช่นเดียวกันกับซอฟท์แวร์ได้ จึงเป็นสาเหตุให้เกิดการขาดแคลนซอฟท์แวร์


การมาถึงของไมโครโปรเซสเซอร์มีส่วนทำให้วิกฤตกาลซอฟท์แวร์รุนแรงขึ้น

ในปีค.ศ. 1968 องค์การนาโต้ (NATO องค์การสนธิสัญญาแอตแลนติกเหนือ) ได้จัดสัมมนาเรื่อง วิศวกรรมซอฟท์แวร์ ที่ประเทศเยอรมัน เพื่อหาแนวทางแก้ไขวิกฤตกาลซอฟท์แวร์ การสัมมนานี้วางรากฐานของวิศวกรรมซอฟท์แวร์ โดยหยิบยืมเทคโนโลยีและวิธีปฏิบัติจากสาขาวิชาอื่น มาปรับใช้กับการสร้างซอฟท์แวร์ ซึ่งไม่ได้หมายถึงแค่วิธีเขียนโค้ด แต่ยังรวมถึงขึ้นตอนปฏิบัติอื่นๆ ด้วย เช่น การออกแบบ การทดสอบ การบริหารโครงการ และงานวางแผนต่างๆ เป็นต้น

ในปี ค.ศ. 1992 ไอวาร์ จาคอบสัน (Ivar Jacobson) ได้นำเสนอแนวคิด วิศวกรรมซอฟท์แวร์แบบวัตถุวิธี (Object-oriented software engineering หรือ OOSE) แนวคิดนี้เสนอให้นำหลักการ use cases มาประยุกต์ใช้กับการออกแบบซอฟท์แวร์โดยโดยการใช้ UML (Unified Modeling Language) เป็นเครื่องมือหลัก

ทั้ง OOSE และ OOP ต่างเป็นส่วนหนึ่งของวิชา “การออกแบบและวิเคราะห์แบบวัตถุวิธี” (Object-oriented Analysis and Design หรือ OOAD) แม้ OOSE และ OOP จะชื่อคล้ายกันและอยู่ในวิชา OOAD เหมือนๆ กัน แต่ก็เป็นสองหัวข้อวิชาที่แยกจากกัน โดย OOSE เน้นเรื่องการออกแบบ ส่วน OOP เน้นเรื่องการเขียนโค้ด ในหนังสือเล่มนี้ผู้เขียนจะสอนวิธีคิดและเขียนโค้ดให้เป็น OOP เท่านั้น หากต้องการศึกษาเรื่อง OOAD และ OOSE ท่านอาจศึกษาได้ชั้นเรียนวิชานี้ หรือจากตำราเล่มอื่น

ขอย้อนกลับไปในช่วงทศวรรษ 1970 มีการเสนอว่าหากจะแก้วิกฤตซอฟท์แวร์ ก็น่าจะหาทางทำให้การสร้างซอฟท์แวร์ง่ายเหมือนฮาร์ดแวร์ ในสมัยนั้นฮาร์ดแวร์ส่วนมากถูกสร้างจากไอซีดิจิตอล แบบ “โลจิกเกต” ยกตัวอย่าง เช่น หากท่านต้องการสร้างวงจรดิจิตอลอะไรสักอย่าง ท่านไม่จำเป็นต้องนำทรานซิสเตอร์ ตัวต้านทาน และตัวเก็บประจุมาต่อกัน แต่ท่านสามารถเลือกไอซีที่เป็น โลจิกเกต (logic gate) ที่มีอยู่มากมายหลายร้อยแบบ นำมาสร้างเป็นวงจร digital combination (ดิจิตอล คอมบิเนชัน คือวงจรดิจิตอลที่เกิดจากการนำ logic gate หลายๆ แบบมาเชื่อมต่อกัน) ที่มีคุณสมบัติตามที่ท่านต้องการได้ไม่ยาก

การนำไอซีดิจิตอลมาใช้งานท่านไม่จำเป็นต้องรู้กระบวนการทำงานภายในของมัน ท่านเพียงแต่ต้องรู้ว่ามันต้องการอินพุท (input) อย่างไร และจะให้ผลลัพธ์ (output) ออกมาเป็นอย่างไร (ข้อมูลเพื่อการนำไปเชื่อมต่อหรือ interface กับไอซีตัวอื่น) ซึ่งเป็นเรื่องดี เพราะท่านไม่ต้องเสียเวลาไปกับการเรียนรู้วิธีทำงานภายในของไอซีแต่ละตัว ทำให้การออกแบบสร้างวงจรใหม่ๆ ทำได้รวดเร็วและง่ายขึ้นมาก นี่คือสาเหตุหนึ่งที่ทำให้วงการฮาร์ดแวร์ก้าวหน้าไปได้อย่างรวดเร็ว

เราอาจจะมองว่าไอซีแต่ละตัวคือ component (อ่านว่า คอมโพเนนท์ แปลว่าชิ้นส่วนหรือส่วนประกอบ) เหมือนชิ้นของเล่นพลาสติก เลโก (Lego) ที่มีรูปแบบต่างๆ มากมาย ทุกชิ้นถูกออกแบบให้มี interface ตรงกัน เราจึงสามารถนำเลโกมาต่อเป็นของเล่นต่างๆ ได้สารพัด


ของเล่นพลาสติก เลโก (Lego) ทุกชิ้นถูกออกแบบให้มี interface ตรงกัน

ย้อนกลับไปอีกในปี 1968 องค์การนาโต้ (NATO องค์การสนธิสัญญาแอตแลนติกเหนือ) ได้จัดสัมมนาเรื่อง Mass Produced Software Components (การผลิตชิ้นส่วนซอฟท์แวร์เป็นจำนวนมาก) ที่ประเทศเยอรมัน เพื่อต้านวิกฤตกาลซอฟท์แวร์ การสัมมนานี้วางรากฐานแนวคิดการทำซอฟท์แวร์ให้เป็น component หรือซอฟท์แวร์ไอซี ผู้นำการสัมมนาเรียกแนวคิดนี้ว่า Component Oriented Programming (ย่อว่า COP) หรือการเขียนโปรแกรมโดยเน้นการสร้างชิ้นส่วน

component หมายถึง Object ที่ถูกสร้างขึ้นตามข้อกำหนดจะเพาะเพื่อตอบสนองเป้าหมายห้าประการคือ

  1. นำกลับมาใช้ใหม่ได้
  2. เป็นอิสระต่อสภาพแวดล้อม
  3. ทำงานร่วมกับ component อื่นได้
  4. ใช้วิธี Encapsulation
  5. เป็นอิสระต่อการนำไปใช้และการปรับเปลี่ยนเวอร์ชัน


ภาษา C# เป็นภาษา OOP ที่สนับสนุนหลักการ COP อย่างจริงจัง หลักการ COP มีหลายอย่างตรงกับ OOP เช่นการส่ง object ไปเก็บในหน่วยความจำ หรือส่งไปในเครือข่ายโดยเรียงออกไปกันแบบอนุกรม และให้อยู่ในรูปแบบที่คนสามารถอ่านได้ (เช่น XML) เมื่อไปถึงจุดหมายแล้วจะกลับมารวมตัวกันใหม่ (ซึ่งอันที่จริงแล้วเป็นสำเนาหรือ “โคลน” ของตัวจริง) วิธีทำเช่นนี้คำ จาร์กอน เรียกว่า serialization (อ่านว่า ซีเรียลไลเซชัน แปลว่าการทำให้เป็นอนุกรม) หรือ Marshalling (อ่านว่า มาแชลลิง แปลว่าการเรียงกันออกไป ในการเรียนภาษา C# ท่านจะพบกับการทำ มาแชลลิง อยู่เนืองๆ)