Thứ Tư, 1 tháng 4, 2009

Lấy dữ liệu từ một trang popup

Bài viết này sẽ hướng dẫn bạn cách lấy giá trị từ một trang popup của một trang web để trả về cho trang sinh ra nó như thế nào. Các bước tiến hành như sau: Trong trang thứ nhất, chúng ta gọi là trang Parent.html có chức năng sinh ra một trang con (popup...

Bài viết này sẽ hướng dẫn bạn cách lấy giá trị từ một trang popup của một trang web để trả về cho trang sinh ra nó như thế nào.

Các bước tiến hành như sau:

Trong trang thứ nhất, chúng ta gọi là trang Parent.html có chức năng sinh ra một trang con (popup form). Trong trang này chúng ta chỉ có một nút như sau:

Nút này sẽ gọi đến hàm ShowDialog() khi được nhấn để gọi ra trang thứ hai. Đây là mã lệnh của trang Parent.html:

  1. Parent
  2. "parentDiv">
  3. 'button' name = 'button' value='Hiển thị Popup' onclick='ShowDialog();'>

Trong đoạn mã trên, chúng ta có một thẻ div có thuộc tính idparentDiv dùng để nhận giá trị sẽ được lấy về từ trang con sẽ sinh ra khi nhấn nút.

Ở trang thứ hai, là trang sẽ được mở ra khi nhấn nút trong trang Parent.html, được thiết kế gồm có một một thẻ div chứa nội dung cần lấy giá trị và một nút để thực hiện truyền giá trị này cho trang Parent.html

Mã lệnh trong trang Child.html như sau:

  1. "childDiv">Hi, hello, I'm APTECH
  2. button' name = 'button' value='Done' onclick=Done();'>

Mọi thẻ HTML nếu có id thì đều có thể tìm đến nó để thao tác thông qua một DOM object có tên là document (sử dụng phương thức getElementById()). Để lấy hoặc thiết lập nội dung của thẻ đó, ta sử dụng thuộc tính innerHTML. Còn opener là đối tượng của cửa sổ cha tương ứng với trang Parent.html

Kết quả nhận được khi nhấn nút Done từ trang Child.html như sau

Upload nhiều file XML vào cột dữ liệu XML

Bài viết này sẽ thảo luận đến việc làm thế nào để upload nhiều file (đặc biệt là file XML) vào cột kiểu dữ liệu XML của cơ sở dữ liệu SQL Server. Bước 1: Phải đảm bảo xp_cmdshell đã được cho phép. Nếu chưa được, hãy thực thi một số câu lệnh dưới đây use...

Bài viết này sẽ thảo luận đến việc làm thế nào để upload nhiều file (đặc biệt là file XML) vào cột kiểu dữ liệu XML của cơ sở dữ liệu SQL Server.

Bước 1:

Phải đảm bảo xp_cmdshell đã được cho phép. Nếu chưa được, hãy thực thi một số câu lệnh dưới đây
  1. use master
  2. go
  3. sp_configure 'show advanced options',1
  4. go
  5. reconfigure with override
  6. go
  7. sp_configure 'xp_cmdshell',1
  8. go
  9. reconfigure with override
  10. go

Bước 2:

Tạo một CSDL và bảng được dùng cho việc import này bằng các câu lệnh dưới. Nếu không bạn có thể sử dụng CSDL đang có sẵn.
  1. USE [master]
  2. GO
  3. /****** Object: Database [XMLTest]
  4. Script Date: 04/17/2007 01:49:43 ******/
  5. IF EXISTS (SELECT name FROM sys.databases WHERE name = N'XMLTest')
  6. DROP DATABASE [XMLTest]
  7. go
  8. create database XMLTest
  9. go
  10. use XMLTest
  11. go

Bước 3:

Đảm bảo rằng bạn đã tạo một bảng với kiểu dữ liệu XML. Ngoài ra, hãy chắc chắn có ít nhất một cột trong bảng có thể chứa giá trị của tên file như sau
  1. use [XMLTest]
  2. /****** object: table [dbo].[myimage]
  3. script date: 09/10/2006 21:55:46 ******/
  4. if exists (select * from sys.objects
  5. where object_id = object_id(N'[MYXML]') and type in (N'u'))
  6. drop table [MYXML]
  7. go
  8. create table [MYXML] (
  9. [id] int identity(1,1),
  10. [XML File Name] varchar(100),
  11. [Data] XML)
  12. Go

Bước 4:

Giả sử bạn muốn upload toàn bộ file .bmp từ thư mục C:\XML vào bảng “MYXML” trong lược đồ “dbo” trên cơ sở dữ liệu “XMLTest

Nội dung ví dụ Customer.xml

  1. "1.0" standalone="yes"?>
  2. 2007-03-31T06:40:38.0000000-05:00
  3. Rainbow.River
  4. 1AE
  5. A-Accessible
  6. 761
  7. Stopped
  8. 30
  9. 2007-03-31T06:40:38.0000000-05:00
  10. Rainbow.River
  11. 1AE
  12. Not-Accessible
  13. 870
  14. Stopped
  15. 30
  16. 2007-03-31T06:40:38.0000000-05:00
  17. Rainbow.River
  18. 1AE
  19. A-Accessible
  20. 97F
  21. Started
  22. 30

Bước 5:

Hãy tạo một thủ tục usp_uploadXMLFilesm [sử dụng copy và paste đoạn mã dưới đây hoặc download file usp_uploadXMLFiles có sẵn]. Việc tạo này là tạo một thủ tục lưu trữ usp_uploadXMLfiles trên cơ sở dữ liệu chủ vì vậy nó có thể thực thi và gọi bất kỳ cơ sở dữ liệu nào.
  1. USE [master]
  2. GO
  3. /****** Object: StoredProcedure [dbo].[usp_uploadXMLfiles] Script Date: 09/10/2006 23:33:34 ******/
  4. IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_uploadXMLfiles]') AND type in (N'P', N'PC'))
  5. DROP PROCEDURE [dbo].[usp_uploadXMLfiles]
  6. go
  7. set quoted_identifier off
  8. go
  9. create procedure usp_uploadXMLfiles
  10. @databasename varchar(128),
  11. @schemaname varchar(128),
  12. @tablename varchar(128),
  13. @FileNameColumn varchar(128),
  14. @xmlcolumn varchar(128),
  15. @path varchar(500),
  16. @filetype varchar(10),
  17. @printorexec varchar(5) = 'print'
  18. as
  19. set nocount on
  20. declare @dircommand varchar(1500)
  21. declare @insertquery varchar(2000)
  22. declare @updatequery varchar(2000)
  23. declare @count int
  24. declare @maxcount int
  25. declare @filename varchar(500)
  26. set @count=1
  27. set @dircommand = 'dir /b '+@path+@filetype
  28. create table #dir (name varchar(1500))
  29. insert #dir(name) exec master..xp_cmdshell @dircommand
  30. delete from #dir where name is NULL
  31. create table #dir2 (id int identity(1,1),name varchar(1500))
  32. insert into #dir2 select name from #dir
  33. --select * from #dir2
  34. set @maxcount = ident_current('#dir2')
  35. print 'set quoted_identifier off'
  36. print 'go'
  37. while @count <=@maxcount
  38. begin
  39. set @filename =(select name from #dir2 where id = @count)
  40. set @insertquery = 'Insert into ['+@databasename+'].['+@schemaname+'].['+@tablename+']
  41. ([' +@filenamecolumn +']) values ("mailto:'+@filename+'%22)'
  42. set @updatequery = 'update ['+@databasename+'].['+@schemaname+'].['+@tablename+']
  43. set ['+@xmlcolumn+'] = (SELECT * FROM OPENROWSET(BULK "'+@path+@filename+'", SINGLE_BLOB)AS x )
  44. WHERE ['+@filenamecolumn +']="mailto:'+@filename+'%22'
  45. if @printorexec ='print'
  46. begin
  47. print @insertquery
  48. print @updatequery
  49. end
  50. if @printorexec ='exec'
  51. begin
  52. set @insertquery='set quoted_identifier off' + char(10)+char(13)+@insertquery
  53. set @updatequery='set quoted_identifier off' + char(10)+char(13)+@updatequery
  54. exec (@insertquery)
  55. exec (@updatequery)
  56. end
  57. set @count = @count +1
  58. end
  59. go

Thủ tục này chấp nhận các tham số sau:

@databasename = Tên của cơ sở dữ liệu có giản đồ và bảng đang tồn tại.

@schemaname = Giảm đồ cơ sở dữ liệu có bảng đang tồn tại

@tablename = Tên của bảng có các file sẽ được upload

@FileNameColumn = Tên của cột trong bảng có tên file để lưu trữ

@XMLcolumn = Cột kiểu dữ liệu XML hiện tại có file sẽ được lưu trữ như XML

@path = Đường dẫn của tất cả các file cần có để upload. Ví dụ “C:\Windows\”

@filetype = Loại file muốn upload. Ví dụ “*.XML”

@printorexec = Nếu “Print” được đặt như một tham số, nó sẽ tự tạo ra và hiển thị các lệnh. Nếu “Exec” được đặt như một tham số, nó sẽ ngay lập tức thực thi câu lệnh có ý nghĩa upload tất cả các file.

Bước 6:

Thực thi thủ tục với tham số printorexec=’print’ theo đoạn mã dưới đây
  1. Exec master..[usp_uploadXMLfiles]
  2. @databasename ='XMLTest',
  3. @schemaname ='dbo',
  4. @tablename ='MYXML',
  5. @FileNameColumn ='XML File Name',
  6. @XMLcolumn = 'Data',
  7. @path = 'c:\XML\',
  8. @filetype ='*.xml',
  9. @printorexec ='print'

Thủ tục này sẽ tự tạo ra tất cả các câu lệnh cần thiết cho việc tạo một dòng cho từng file và update dòng với file thuộc tính theo đoạn mã sau.

  1. set quoted_identifier off
  2. go
  3. Insert into [XMLTest].[dbo].[MYXML] ([XML File Name]) values ("Customer1.xml")
  4. update [XMLTest].[dbo].[MYXML] set [Data] = (SELECT *
  5. FROM OPENROWSET(BULK "c:\XML\Customer1.xml", SINGLE_BLOB)AS x )
  6. WHERE [XML File Name]="Customer1.xml"
  7. Insert into [XMLTest].[dbo].[MYXML] ([XML File Name]) values ("Customer2.xml")
  8. update [XMLTest].[dbo].[MYXML] set [Data] = (SELECT *
  9. FROM OPENROWSET(BULK "c:\XML\Customer2.xml", SINGLE_BLOB)AS x )
  10. WHERE [XML File Name]="Customer2.xml"
  11. Insert into [XMLTest].[dbo].[MYXML] ([XML File Name]) values ("Customer3.xml")
  12. update [XMLTest].[dbo].[MYXML] set [Data] = (SELECT *
  13. FROM OPENROWSET(BULK "c:\XML\Customer3.xml", SINGLE_BLOB)AS x )
  14. WHERE [XML File Name]="Customer3.xml"
  15. Insert into [XMLTest].[dbo].[MYXML] ([XML File Name]) values ("Customer4.xml")
  16. update [XMLTest].[dbo].[MYXML] set [Data] = (SELECT *
  17. FROM OPENROWSET(BULK "c:\XML\Customer4.xml", SINGLE_BLOB)AS x )
  18. WHERE [XML File Name]="Customer4.xml"
  19. Insert into [XMLTest].[dbo].[MYXML] ([XML File Name]) values ("Customer5.xml")
  20. update [XMLTest].[dbo].[MYXML] set [Data] = (SELECT *
  21. FROM OPENROWSET(BULK "c:\XML\Customer5.xml", SINGLE_BLOB)AS x )
  22. WHERE [XML File Name]="Customer5.xml"
  23. Insert into [XMLTest].[dbo].[MYXML] ([XML File Name]) values ("Customer6.xml")
  24. update [XMLTest].[dbo].[MYXML] set [Data] = (SELECT *
  25. FROM OPENROWSET(BULK "c:\XML\Customer6.xml", SINGLE_BLOB)AS x )
  26. WHERE [XML File Name]="Customer6.xml"
  27. Insert into [XMLTest].[dbo].[MYXML] ([XML File Name]) values ("Customer7.xml")
  28. update [XMLTest].[dbo].[MYXML] set [Data] = (SELECT *
  29. FROM OPENROWSET(BULK "c:\XML\Customer7.xml", SINGLE_BLOB)AS x )
  30. WHERE [XML File Name]="Customer7.xml"

Bước 7:

Thực thi thủ tục với tham số printorexec=’exec’ theo đoạn mã dưới
  1. Exec master..[usp_uploadXMLfiles]
  2. @databasename ='XMLTest',
  3. @schemaname ='dbo',
  4. @tablename ='MYXML',
  5. @FileNameColumn ='XML File Name',
  6. @XMLcolumn = 'Data',
  7. @path = 'c:\XML\',
  8. @filetype ='*.xml',
  9. @printorexec ='exec'

Đoạn mã sẽ upload toàn bộ các file xml

Bước 8:

Giờ thì chúng ta sẽ truy vấn bảng sử dụng câu lệnh SQL thực hiện như đoạn dưới
  1. use XMLTest
  2. go
  3. select * from myxml
  4. go

Thủ tục này sẽ trả về kết quả như hình dưới:

Bước 9:

Kích lên các kết nối dữ liệu XML để phát sinh kết quả như dưới đây
  1. 2007-03-31T06:40:38.0000000-05:00
  2. Dancing.Doll
  3. 1AE
  4. A-Accessible
  5. 761
  6. Stopped
  7. 30
  8. 2007-03-31T06:40:38.0000000-05:00
  9. Dancing.Doll
  10. 1AE
  11. Not-Accessible
  12. 870
  13. Stopped
  14. 30
  15. 2007-03-31T06:40:38.0000000-05:00
  16. Dancing.Doll
  17. 1AE
  18. A-Accessible
  19. 97F
  20. Started
  21. 30

Lưu nội dung CSDL vào tài liệu XML

Chương trình sau thực hiện việc lấy dữ liệu từ một bảng trong cơ sở dữ liệu và lưu lại nội dung vào một tài liệu XML. Bạn có thể thực hiện theo như hướng dẫn trong phần chú thích để đạt được kết quả mong muốn. using System; using System.Collections.Generic;...

Chương trình sau thực hiện việc lấy dữ liệu từ một bảng trong cơ sở dữ liệu và lưu lại nội dung vào một tài liệu XML. Bạn có thể thực hiện theo như hướng dẫn trong phần chú thích để đạt được kết quả mong muốn.

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Data.SqlClient;
  5. using System.Xml;
  6. using System.Data;
  7. namespace Test
  8. {
  9. class Class1
  10. {
  11. static void Main(string[] args)
  12. {
  13. //tạo đối tượng DataSet
  14. DataSet ds = new DataSet();
  15. //chuỗi nối kết với SQL SERVER
  16. string connString = @"server = (local);database = northwind;uid=sa;pwd=123456";
  17. //tạo bộ kết nối
  18. SqlConnection conn = new SqlConnection(connString);
  19. //câu lệnh truy vấn dữ liệu
  20. string query = "select * from customers where region = 'WA' ";
  21. //tạo Adapter và điền đầy DataSet
  22. SqlDataAdapter da = new SqlDataAdapter(query, conn);
  23. da.Fill(ds, "customers");
  24. //tạo đối tượng XmlDataDocument, lấy dữ liệu từ DataSet
  25. XmlDataDocument xmlDataDoc = new XmlDataDocument(ds);
  26. //lưu nội dung trong DataSet vào tập tin C:\customers.xml
  27. xmlDataDoc.Save(@"C:\customers.xml");
  28. //đóng dứt kết nối
  29. conn.Close();
  30. Console.Write("Successful!");
  31. }
  32. }
  33. }

Và đây là kết quả đưa ra khi chạy chương trình trên:

Lấy thông tin trình duyệt người dùng

Nhiều lúc bạn muốn lấy IP của máy client đang duyệt Web hay lấy file đang được thực thi hay trình duyệt của client hay v v... và v v... nhưng bạn không biết làm thế nào để có được các thông tin đó. Bạn có thể sử dụng đoạn code sau đây để hiển thị toàn...

Nhiều lúc bạn muốn lấy IP của máy client đang duyệt Web hay lấy file đang được thực thi hay trình duyệt của client hay v v... và v v... nhưng bạn không biết làm thế nào để có được các thông tin đó. Bạn có thể sử dụng đoạn code sau đây để hiển thị toàn bộ các thông tin trên và chọn ra thông tin nào cần lấy cho mình.

  1. <%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
  2. "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. "http://www.w3.org/1999/xhtml">
  4. "Content-Type" content="text/html; charset=iso-8859-1" />
  5. Test Web Browser
  6. <%
  7. for each x in Request.ServerVariables
  8. response.write(""&x & "
    "
    )
  9. response.write(Request.ServerVariables(x) & "
    "
    )
  10. Response.Write("
    "
    )
  11. next
  12. %>

Khi chạy chương trình, chúng ta sẽ lấy được rất nhiều thông tin như sau:

ALL_HTTP
HTTP_ACCEPT:*/* HTTP_ACCEPT_LANGUAGE:en-us HTTP_CONNECTION:Keep-Alive HTTP_HOST:localhost HTTP_USER_AGENT:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Monava Toolbar; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022) HTTP_COOKIE:ASPSESSIONIDSCBCADQS=LBJPJHICJJGHPDEGDCOJNBEB HTTP_UA_CPU:x86 HTTP_ACCEPT_ENCODING:gzip, deflate


ALL_RAW
Accept: */* Accept-Language: en-us Connection: Keep-Alive Host: localhost User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Monava Toolbar; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022) Cookie: ASPSESSIONIDSCBCADQS=LBJPJHICJJGHPDEGDCOJNBEB UA-CPU: x86 Accept-Encoding: gzip, deflate


APPL_MD_PATH
/LM/W3SVC/1/ROOT


APPL_PHYSICAL_PATH
c:\inetpub\wwwroot\


AUTH_PASSWORD


AUTH_TYPE


AUTH_USER


CERT_COOKIE


CERT_FLAGS


CERT_ISSUER


CERT_KEYSIZE


CERT_SECRETKEYSIZE


CERT_SERIALNUMBER


CERT_SERVER_ISSUER


CERT_SERVER_SUBJECT


CERT_SUBJECT


CONTENT_LENGTH
0


CONTENT_TYPE


GATEWAY_INTERFACE
CGI/1.1


HTTPS
off


HTTPS_KEYSIZE


HTTPS_SECRETKEYSIZE


HTTPS_SERVER_ISSUER


HTTPS_SERVER_SUBJECT


INSTANCE_ID
1


INSTANCE_META_PATH
/LM/W3SVC/1


LOCAL_ADDR
127.0.0.1


LOGON_USER


PATH_INFO
/asp/testBrowser.asp


PATH_TRANSLATED
c:\inetpub\wwwroot\asp\testBrowser.asp


QUERY_STRING


REMOTE_ADDR
127.0.0.1


REMOTE_HOST
127.0.0.1


REMOTE_USER


REQUEST_METHOD
GET


SCRIPT_NAME
/asp/testBrowser.asp


SERVER_NAME
localhost


SERVER_PORT
80


SERVER_PORT_SECURE
0


SERVER_PROTOCOL
HTTP/1.1


SERVER_SOFTWARE
Microsoft-IIS/5.1


URL
/asp/testBrowser.asp


HTTP_ACCEPT
*/*


HTTP_ACCEPT_LANGUAGE
en-us


HTTP_CONNECTION
Keep-Alive


HTTP_HOST
localhost


HTTP_USER_AGENT
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Monava Toolbar; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)


HTTP_COOKIE
ASPSESSIONIDSCBCADQS=LBJPJHICJJGHPDEGDCOJNBEB


HTTP_UA_CPU
x86


HTTP_ACCEPT_ENCODING
gzip, deflate

Xây dựng Windows Service với C#

Bài viết này sẽ hướng dẫn các bạn viết một trình ứng dụng với mục tiêu âm thầm theo dõi giám sát một thư mục nào đó trên máy tính. Do trình ứng dụng thuộc loại Windows Service nên sau khi viết xong các bạn có thể cài đặt và vận hành nó giống như là một...

Bài viết này sẽ hướng dẫn các bạn viết một trình ứng dụng với mục tiêu âm thầm theo dõi giám sát một thư mục nào đó trên máy tính. Do trình ứng dụng thuộc loại Windows Service nên sau khi viết xong các bạn có thể cài đặt và vận hành nó giống như là một service.

Bài viết này sẽ thú vị đối với các bạn có thiên hướng lập trình mạng, đặc biệt đối với các bạn đang là quản trị mạng, các bạn có thể ứng dụng kỹ thuật này cho nhiều mục tiêu quan trọng khác.

I Tổng quan

Windows Services cung cấp phương tiện cho application logic chạy liên tục trên máy tính của bạn, thông thường là việc cung cấp điều khiển thiết bị hoặc các dịch vụ hệ điều hành. Windows Services là hữu dụng đối với các ứng dụng phía server mà ta muốn chúng phải luôn ở trạng thái sẵn sàng phục vụ các yêu cầu từ client. Nói chung, nếu bạn có nhu cầu xây dựng một trình ứng dụng mà bản chất hoạt động của nó mang tính “âm thầm làm việc” và không cần sự tương tác trực tiếp của người dùng, bạn có thể nghĩ ngay đến việc tạo trình ứng dụng loại Windows Service.

Windows Service là một ứng dụng chạy trên máy server hoặc workstation và cung cấp những chức năng mà sự diễn tiến của nó không cần sự tương tác trực tiếp của người dùng. Windows Services thường được dùng để giám sát hoạt động hệ thống.

Một Windows Service sẽ chạy trong tiến trình của riêng nó, không phụ thuộc người dùng hay các chương trình khác đang chạy trên cùng máy tính. Windows Services thường được cấu hình để tự động bắt đầu khi nào máy tính khởi động. Không giống như đa phần các ứng dụng, Windows Services chạy dưới nhận dạng bảo mật của chính nó, thay vì dưới nhận dạng của đăng nhập người dùng hiện hành. Chúng có thể bắt đầu chạy, ngay cả nếu không có người dùng (user) đăng nhập máy tính.

Khi mà bạn tạo một ứng dụng với mục tiêu ứng dụng này sẽ chạy như là một Windows Service, bạn cần phải lưu ý rằng nó không bao gồm bất kỳ các yếu tố giao tiếp người dùng như Message Boxes hay Dialog Boxes. Một Windows Service không có tính chất cung cấp một giao diện trực quan (visual interface) cho người dùng.

Thông thường một Windows Service sẽ báo cáo đặc thù các kết quả và thông báo lỗi của nó tới một sổ ghi biến cố (event log). Tuy nhiên bạn cũng có thể kết hợp nó với Web Service để làm những việc “động trời” hơn như là âm thầm chuyển thông tin từ máy mà nó đang được cài đặt đến một máy ở xa thông qua đường truyền internet.

Nếu như bạn đã quen thuộc với Microsoft SQL Server 2000, bạn sẽ nhận thấy nó chạy như là một Windows Service. Một ví dụ dễ hiểu của ứng dụng Windows ServiceWindows Time Service, nó cập nhật thông tin đồng hồ mà bạn thấy trên thanh taskbar của máy tính. Trước đây, việc phát triển các ứng dụng dạng này là rất khó khăn. Giờ đây, nhờ có .NET Framework chứa một tập các class, cung cấp các chức năng cơ bản cho việc cài đặt và phát triển dễ dàng các ứng dụng Windows Service trên nền C# .NET .

II Tạo ứng dụng loại Windows Service.

Bước 1:

Khởi động Visual Studio .NET và tạo một project mới với việc sử dụng mẫu Windows Service. Đặt tên cho project là wsGiamSatThuMuc và chứa nó vào một thư mục trên máy tính của bạn.

Bước 2:

Trên cửa sổ Solution Explorer đổi tên của component có tên Service1.cs thành GiamSatThuMuc.cs.

Bước 3:

DoubleClick vào GiamSatThuMuc.cs à Properties window. Trên cửa sổ Properties lần lượt thực hiện các công việc sau:
· Tại mục ServiceName: đổi tên mặc định service1GiamSatThuMuc.
· Tại mục AutoLog : Thiết lập giá trị là False.
· Tại mục CanStop: Thiết lập giá trị là True.


Bước 4:

Click chọn hiển thị hộp công cụ (Toolbox) của Visual Studio .NET --> click tab : Components --> click chọn EventLog (Là một component) kéo thả vào cửa sổ design.

Bước 5:

Trên cửa sổ design --> click vào biểu tượng EventLog --> cửa sổ Properties --> Tại mục Name đổi tên mặc định EventLog1 thành GetLoginNameEventLog

Bước 6:

Trên cửa sổ design --> click vào biểu tượng EventLog --> cửa sổ Properties --> Tại mục Name đổi tên mặc định EventLog1 thành SoGhiGiamSatThuMuc.

Bước 7:

Mở màn hình soạn thảo mã lệnh của GiamSatThuMuc.cs --> Bạn sẽ thấy rằng C# sẽ tự động bổ sung :

Dòng khai báo

  1. using System.ServiceProcess

Khai báo kế thừa từ class :

  1. System.ServiceProcess.ServiceBase

Hai phương thức quan trọng được bổ sung:

  1. protected override void OnStart(string[] args)
  2. {
  3. // TODO: Add code here to start your service.
  4. }
  5. protected override void OnStop()
  6. {
  7. // TODO: Add code here to perform any tear-down necessary to stop your service.
  8. }

Đây là hai phương thức có vai quan trọng. Các dòng lệnh mà bạn muốn chúng thực thi mỗi khi service start được đặt bên trong phương thức OnStart. Các dòng lệnh mà bạn muốn chúng thực thi mỗi khi service stop được đặt bên trong phương thức OnStop.

Bạn cần bổ sung vào phương thức khởi tạo của class GiamSatThuMuc các dòng lệnh sau:

  1. public GiamSatThuMuc()
  2. {
  3. InitializeComponent();
  4. if (!(System.Diagnostics.EventLog.SourceExists("GiamSatThuMuc_Source ")) )
  5. {
  6. System.Diagnostics.EventLog.CreateEventSource("GiamSatThuMuc_Source", "GiamSatThuMuc_Log");
  7. }
  8. GiamSatThuMucEventLog.Source = "GiamSatThuMuc_Source";
  9. GiamSatThuMucEventLog.Log = "GiamSatThuMuc_Log";
  10. }

Chú ý rằng bạn không nên đặt các dòng lệnh này ở phương thức OnStart, mặc dù việc bổ sung này khiến nó vẫn hoạt động. Lý do của việc bổ sung vào phương thức khởi tạo của class là để nó chỉ chạy một lần.

Bước 8:

Thêm mã chương trình vào các phương thức xử lý biến cố OnStartOnStop. Để viết đoạn mã lệnh cho phương thức OnStart, bạn gõ vào đoạn mã như trình bày sau đây:
  1. protected override void OnStart(string[] args)
  2. {
  3. FileSystemWatcher watch = new FileSystemWatcher();
  4. watch.Path = @"c:\Watcher\";
  5. watch.Changed += new FileSystemEventHandler(OnChanged);
  6. watch.Created += new FileSystemEventHandler(OnChanged);
  7. watch.Deleted += new FileSystemEventHandler(OnChanged);
  8. watch.Renamed += new RenamedEventHandler(OnRenamed);
  9. watch.EnableRaisingEvents = true;
  10. watch.IncludeSubdirectories = true;
  11. Console.ReadLine();
  12. }
  13. //--------------------------------------------------
  14. private void OnChanged(object source, FileSystemEventArgs e)
  15. {
  16. // Specify what is done when a file is changed, created, or deleted.
  17. string dir = @"c:\Watcher\" + e.Name;
  18. if (e.FullPath == dir)
  19. {
  20. Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
  21. GiamSatThuMucEventLog.WriteEntry("Da co thao tac Change trong thu muc Watcher tren C");
  22. }
  23. }
  24. // ----------------------------------------------------------------------------------
  25. private void OnRenamed(object source, RenamedEventArgs e)
  26. {
  27. // Specify what is done when a file is renamed.
  28. string dir = @"c:\Watcher\" + e.Name;
  29. if (e.FullPath == dir)
  30. {
  31. Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
  32. GiamSatThuMucEventLog.WriteEntry("Da co thao tac rename trong thu muc Watcher tren C");
  33. }
  34. }

Đoạn mã lệnh trên nhằm mục tiêu khi service được start trình ứng dụng sẽ giám sát thư mục C:\Watcher. Bạn có thể bổ sung thêm theo ý mình, ở đây chúng ta chỉ viết mã lệnh tướng ứng với các sự kiện OnChangedOnRenamed.

Chú ý: Trong phần mã lệnh của GiamSatThuMuc.Designer.cs bạn cần sửa biểu thị private à public tương ứng với khai báo GiamSatThuMucEventLog dòng lệnh sau:

  1. public System.Diagnostics.EventLog GiamSatThuMucEventLog;

Thêm vào thành phần Installer :

Bước 9:

Click chuyển sang cửa sổ design của GiamSatThuMuc.cs. Bên trong cửa sổ này click phải chuột à click chọn mục Add Installer .

Một class có tên là ProjectInstaller.cs sẽ được thêm vào project của bạn. Bạn sẽ thấy ở màn hình design của thành phần này có hai biểu tượng thành tố khác trên nó là : ServiceProcessInstaller1ServiceInstaller1.

Bước 10:

Click vào ServiceProcessInstaller1 và hiển thị cửa sổ Properties --> tại thuộc tính Account click chọn LocalSystem trong danh sách

Bước 11:

Click vào ServiceInstaller1 và hiển thị cửa sổ Properties. Chọn giá trị Automatic cho thuộc tính StartType

Bước 12:

Thực hiện việc build trình ứng dụng

Tạo một trình ứng dụng loại Setup để cài đặt (Install) Service:

Bước 13:

Từ menu à File --> Add Project --> New Project.


Đặt tên ProjectsSetupGiamSatThuMuc

Bước 14:

Trong cửa sổ Solution Explorer, click phải chuột tại SetupGiamSatThuMuc --> Add Project Output

Từ cửa sổ Add Project Output Group --> chọn Primary Output --> click OK

Bước 15:

Trong cửa sổ Solution Explorer, click phải chuột tại mục SetupGiamSatThuMuc -->View --> Custom Actions.

Bước 16 :

Tại mục Custom Actions --> click phải chuột --> Add Custom Action

Bước 17 :

Xuất hiện cửa sổ Select Item in Project --> Double-click mục Application Folder, chọn mục Primary Output from swGiamSatThuMuc (Active) --> click OK.

Bước 18 :

Thực hiện việc build trình ứng dụng SetupGiamSatThuMuc (chú ý nhớ chọn định cấu hình cho SolutionRelease ).

Cài đặt (Installing) và kiểm thử (test) Service

Bước 19 :

Trong thư mục của project vừa tạo SetupGiamSatThuMuc --> bạn vào thư mục con có tên Release và tìm tập tin có tên SetupGiamSatThuMuc.msi. Double-click tập tin này để start việc cài đặt (installation). Thao tác này sẽ start trình Setup Wizard. Chấp nhận tất cả các giá trị ngầm định và hoàn tất việc cài đặt (installation).

Bước 20 :

Để kiểm tra service vừa được cài đặt bạn cần sử dụng công cụ Service Control Manager với các bước thực hiện : click Start --> Programs --> Administrative Tools --> Services. Bạn sẽ thấy GiamSatThuMuc trong danh sách.

Bước 21 :

Click phải trên service của bạn và chọn Properties --> Start

Bước 22 :

Click Start --> Programs --> Administrative Tools --> Event Viewer (Các bước có thể khác tuỳ thuộc hệ điều hành mà bạn đang dùng) để xem sổ ghi biến cố trong Event Viewer .

Chúc các bạn thành công!

Cách debug trong ứng dụng windows service

File Type: doc Chapter1_Eng.doc (668.5 KB, 194 lần tải)

User download: minhtq
password: 123456

Ví dụ về Remoting

  • Project thứ nhất mang ý nghĩa interface
  • Project thứ hai mang ý nghĩa là project cài đặt các xử lý đã khai báo ở interface.
  • Project thứ ba mang ý nghĩa Host phu trách làm việc với phía client. Project này phải được đặt trên máy có địa chỉ thật để một máy client bất kỳ có thể truy cập đến nó thông qua môi trường internet.
  • Project thứ tư mang ý nghĩa là trình ứng dụng phía client.
Nhược điểm của kỹ thuật này là trình ứng dụng phía client phải có cùng nền tảng .NET Framework. Nó sẽ rất tốt đối với các hệ thống thông tin mang ý nghĩa là "hệ thống đóng".

User download: minhtq
password: 123456

File Type: rar Assembly_Interface.rar (9.0 KB, 259 lần tải)
File Type: rar Assembly_Server.rar (13.8 KB, 155 lần tải)
File Type: rar Assembly_Host.rar (19.9 KB, 153 lần tải)
File Type: rar Assembly_Client.rar (32.4 KB, 207 lần tải)