Windows Service Hosting

Một phần của tài liệu Tìm hiểu công nghệ WEC (Windows communication foundation) (Trang 42 - 60)

Nó tương tự như hosting service trong IIS mà không cần kích hoạt tin nhắn. ưu điểm của cách hosting trong Windows service là:

 Dịch vụ sẽ được hosted khi hệ thống được khởi động

 Thời gian sống của tiến trình được điều khiển bởi Service Control Manager trong Windows Service

 Tất cả các phiên bản của Windows đều hỗ trợ hosting WCF service[3].

2.15 Bảo mật trong WCF

Việc bảo mật trong WCF được xác định trong 4 tính năng quan trọng:

 Bảo mật (Confidentiality): đảm bảo các bên không có thẩm quyền sẽ không thể xem được thông điệp mật được truyền giữa bên gửi và bên nhận. Điều này đạt được thông qua việc sử dụng các thuật toán mã hóa.

 Toàn vẹn (Integrity): đảm bảo bên nhận sẽ nhận được chính xác thông điệp mà bên gửi đã gửi. Để làm được điều này, bên gửi phải sử dụng chữ ký điện tử (digital signature) trên các thông điệp gửi.

 Chứng thực (Authentication): tính năng này dùng để kiểm tra người gửi và người nhận là ai và họ có được biết bởi hệ thống hay không.

 Quyền hạn (Authorization): tại thời điểm này, chúng ta đã biết được người gửi hoặc người nhận là ai. Tuy nhiên, cần phải biết được liệu họ có được cấp quyền để thực hiện hành động mà họ đang yêu cầu từ ứng dụng hay không[4][18].

Việc bảo mật trong WCF được mở rộng trên nhiều thành phần trong kiến trúc WCF. Mục tiêu chính của việc bảo mật trong WCF là để cung cấp tính toàn vẹn

(integrity), bảo mật (confidentility), chứng thực (authentication), quyền hạn (authorization) và kiểm soát (auditing) đối với các ứng dụng được xây dựng trên nền tảng WCF. Kiến trúc của WCF được phân ra thành các chức năng sau:

 Mật truyền (Transfer security): chịu trách nhiệm cung cấp thông điệp bí mật (message confidentiality), toàn vẹn dữ liệu (data integrity) và xác thực các bên giao tiếp (authentication of communicating parties).

 Quyền hạn (Authorization): chịu trách nhiệm cung cấp nền tảng cho việc đưa ra các quyết định về quyền hạn (authorization decisions).

 Lưu vết (Auditing): chịu trách nhiệm cho việc ghi lại các sự kiện liên quan đến bảo mật để lưu vết.

 Việc mật truyền (Transfer security) có thể được thực hiện bằng cách sử dụng một trong các chế độ bảo mật (security mode) sau[4][18]

:

 Transport Security Mode: Tất cả 3 chức năng bảo mật được cung cấp bởi transport thường được dùng để truyền các thông điệp giữa Client và service. Chế độ này có ưu điểm là được sử dụng rất nhiều ở các nền tảng khác nhau, và độ phức tạp toán ít hơn. Tuy vậy nhược điểm là chỉ đảm bảo bảo mật các thông điểm từ điểm đến điểm (point to point).

 Message Security Mode: Việc mật truyền (Transfer security) chỉ được cung cấp ở cấp độ thông điệp SOAP, có nghĩa là việc bảo mật được áp dụng trực tiếp đối với thông điệp SOAP ở cấp độ XML. Chế độ này có ưu điểm là không phụ thuộc vào giao thức vận chuyển, dễ mở rộng, đảm bảo bảo mật đầu cuối. Nhược điểm của nó là chậm hơn so với chế độ Transport do nó phải làm việc với XML.

 Transport with Message Credential Security Mode: Việc mật truyền (Transfer security) được thực hiện trên cả tầng transport và message. Tầng transport cung cấp truyền thông bảo mật (communication confidential), toàn vẹn dữ liệu (data integrity) và chứng thực dịch vụ (service authentication). Tầng message cung cấp chứng thực Client (Client authentication).

Một số kịch bản bảo mật trong WCF như[4,18]:

 Client Authentication với Transport–Level Security

 Client Authentication với Message-Level Security

 Trusted Subsystem

 Message Security với Issued Tokens

 Message Security với Mutual Certificates

 Message Security với Windows Client không sử dụng Credential Negotiation

 Message Security with a Windows Client

 Message Security with a Certificate Client

 Message Security with a User Name Client

 Message Security with an Anonymous Client

 Transport Security with Certificate Authentication

 Transport Security with an Anonymous Client

 Transport Security with Windows Authentication

 Transport Security with Basic Authentication

 Intranet Unsecured Client and Service

PHẦN III: XÂY DỰNG CHƢƠNG TRÌNH ỨNG DỤNG

3.1 Khảo sát bài toán

Các công việc chính trong công ty:

 Phòng hành chính, kế toán, nhân sự thực hiện các công việc liên quan đến nhân sự, kế toán, kế hoạch tài vụ…

 Phòng kinh doanh chủ yếu ký kết hợp đồng và tìm kiếm khách hàng

 Phòng biên tập đưa nội dung tin tức lên các website nội bộ của công ty

 Phòng kỹ thuật được chia thành các nhóm khác nhau, phụ trách việc phát triển ứng dụng, thiết kế đồ họa.

Quy trình hoạt động:

 Nhân viên kinh doanh tìm kiếm khách hàng, cập nhật và chuyển hợp đồng cho bộ phận kế toán kiểm tra, duyệt hợp đồng.

 Nếu hợp đồng được duyệt, sẽ chuyển tiếp cho các bộ phận thiết kế, trưởng nhóm thiết kế sẽ tiếp nhận và phân công thiết kế. Khi kết thúc thiết kế, bộ phận kỹ thuật sẽ tiếp nhận công việc.

 Trưởng nhóm kỹ thuật sau khi tiếp nhận hợp đồng sẽ phân công công việc lập trình cho các cá nhân khác trong phòng ban.

 Sau khi lập trình và test xong, bộ phận kỹ thuật sẽ chuyển cho bộ phận chăm sóc khách hàng làm việc đến khi hợp đồng được chấp nhận. Giữa các bộ phận sẽ xảy ra trường hợp hủy yêu cầu nếu chưa đạt.

Các kiểu công việc và hợp đồng bao gồm:

 Theo quy trình: Các công việc được thực hiện khi nhận được hợp đồng dưới dạng dịch vụ như: hợp đồng Domain hosting, hợp đồng quảng cáo Google adwords, hợp đồng Bizweb

 Công việc trực tiếp: Là các công việc được giao trực tiếp giữa các cá nhân

 Công việc theo dự án: Phụ thuộc vào quản lý dự án phân công, tùy từng dự án cụ thể.

Dưới đây là một số đặc tả quy trình làm việc trong công ty DKT:

Trước khi vào workflow: Nhân viên kinh doanh tiếp cận khách hàng, gửi tài liệu, site demo, lấy thông tin

 Gửi tài liệu hướng dẫn sử dụng

 Điền các thông tin thu được vào phiếu yêu cầu của khách hàng

 Thông nhất với khách hàng về giá cả....

Hình 20: Quy trình dịch vụ Bizweb trong công ty DKT

Chuẩn bị hợp đồng:

 Kinh doanh nhập thông tin khách hàng lên hệ thống, chọn loại hợp đồng tương ứng để triết ra hợp đồng tương ứng

 Sau khi ký hợp đồng, Kinh doanh vào chọn loại hợp đồng, thông tin khách hàng đã lưu để tạo hợp đồng ban đầu (Bắt đầu bước 1)

Bƣớc 1

 Kinh doanh tạo hợp đồng mới trên hệ thống, với các thông tin (thông tin khách hàng, thông tin hợp đồng, file đính kèm…)

 Hợp đồng vẫn đang ở trạng thái “Hợp đồng mới” thì Kinh doanh vẫn có thể chỉnh sửa, cập nhật thông tin, hay xóa hợp đồng được.

Bƣớc 2

 Sau khi có hợp đồng mới, màn hình của kế toán hiện lên hợp đồng, kế toán vào xem hợp đồng và xác nhận hợp đồng. Nếu Hợp đồng không hợp lệ, kế toán “không xác nhận” hợp đồng và sẽ chuyển trạng thái “Chờ xác nhận”

 Màn hình của kinh doanh hiện hợp đồng không được xác nhận, kinh doanh thống nhất lại hợp đồng và cập nhật thông tin để kế toán xác nhận lại

 Việc này chỉ dừng lại khi kế toán chấp nhận xác nhận cho hợp đồng

 Hợp đồng chuyển trạng thái “Đang thiết kế” và chuyển sang trưởng nhóm thiết kế

Bƣớc 3

 Sau khi nhận được Hợp đồng ở trạng thái “Đang thiết kế”, trưởng nhóm thiết kế sẽ: Xem các thông tin đính kèm trên bản hợp đồng, xem xét và tiến hành phân công công việc cho các nhân viên thiết kế đồng thời đưa ra hạn hoàn thành cho nhóm thiết kế

 Trong quá trình làm nếu có yêu cầu nào đột xuất từ khách hàng về thiết kế, trạng thái hợp đồng vẫn giữ “Đang thiết kế” , việc này được lưu lại dưới dạng “comment” hoặc “tài liệu thêm” cho hợp đồng

 Nếu hết thời gian mà thiết kế chưa hoàn thành thì vẫn chuyển trạng thái hợp đồng về “Chờ thiết kế”

 Nhóm thiết kế hoàn thành, nhưng kinh doanh và chăm sóc khách hàng bổ sung thêm về việc làm chưa đúng yêu cầu khách hàng, thì sẽ chuyển trạng thái hợp đồng về “Chờ thiết kế”

 Chỉ đến khi nhóm thiết kế, kinh doanh, chăm sóc khách hàng thống nhất về việc hoàn thành bản thiết kế đã đúng yêu cầu thì chuyển hợp đồng về trạng thái “đang triển khai” , và đưa về màn hình của trưởng nhóm triển khai.

Bƣớc 4

 Sau khi nhận được hợp đồng ở trạng thái “Đang triển khai”, trưởng nhóm triển khai sẽ: Xem các thông tin đính kèm trên bản hợp đồng, xem xét và tiến hành phân công công việc cho các nhân viên triển khai đồng thời đưa ra hạn hoàn thành cho nhóm triển khai

 Trong quá trình làm nếu có yêu cầu nào đột xuất từ khách hàng về triển khai, trạng thái hợp đồng vẫn giữ “đang triển khai” , việc này được lưu lại dưới dạng “comment” hoặc “tài liệu thêm” cho hợp đồng

 Nếu hết thời gian triển khai chưa hoàn thành, sẽ chuyển hợp đồng về trạng thái “Chờ triển khai” (mục đích là để đánh giá sự hoàn thành của nhóm triển khai dựa trên khoảng thời gian chờ triển khai)

 Nhóm triển khai hoàn thành, nhưng kinh doanh và và chăm sóc khách hàng bổ sung thêm về việc làm chưa đúng yêu cầu khách hàng thì sẽ chuyển trạng thái hợp đồng về dạng “chờ triển khai”

 Chỉ đến khi nhóm triển khai, kinh doanh, chăm sóc khách hàng thống nhất về việc hoàn thành bản thiết kế đã đúng yêu cầu, sẽ chuyển hợp đồng về trạng thái “Đang bàn giao”, và chuyển đến trưởng nhóm chăm sóc khách hàng.

Bƣớc 5

 Sau khi nhận được hợp đồng “Đang bàn giao”, trưởng nhóm chăm sóc khách hàng sẽ: Xem các thông tin đính kèm trên bản hợp đồng, xem xét và tiến hành phân công công việc cho các nhân viên chăm sóc khách hàng đồng thời đưa ra hạn hoàn thành cho nhóm chăm sóc khách hàng.

 Chăm sóc khách hàng làm việc với khách hàng, nếu khách hàng chấp nhận, sẽ chuyển hợp đồng về dạng “Hoàn thành” và kết thúc hợp đồng, nếu khách hàng yêu cầu thêm về

- Thiết kế: sẽ chuyển hợp đồng về “chờ bàn giao thiết kế” - Kỹ thuật: sẽ chuyển hợp đồng về “Chờ bàn giao triển khai”

 Chỉ khi khách hàng không yêu cầu thì chuyển hợp đồng về trạng thái hoàn thành, kết thúc hợp đồng.

Bƣớc 6

Chăm sóc khách hàng bàn giao đầy đủ cho khách hàng, quyết toán và kết thúc hợp đồng.

3.2 Thiêt kế hệ thống

Việc xác định được quy trình công việc có nghĩa quan trọng, từ đó tôi đã xây dựng các sơ đồ sau:

Hình 22: Class diagram miêu tả quy trình dịch vụ

3.3 Xây dựng chƣơng trình

Áp dụng một số nội dung WCF trong dự án tại một số phần như:

 Cấu hình WCF

 Tổ chức dự án thành ứng dụng n-tiers.

 Xây dựng ứng dụng gadget dùng json-Ajax

 Sử dụng IIS hosting để hosting dịch vụ

Cấu hình WCF

Khi làm việc với các ứng dụng WCF, cấu hình là một công việc không hề dễ dàng, việc cấu hình trong file config nhằm giúp cho trình dịch vụ và Client có thể biết và giao tiếp với nhau thông qua địa chỉ, tên hợp đồng, các binding, behaviors.

Cấu hình dịch vụ WCF, phải được đặt trong khối <system.serviceModel>. Chủ yếu cấu hình phần services và phần behaviors.

<system.serviceModel> <services>

<service behaviorConfiguration="GadgetBehavior" name="Gadget"> <endpoint address="" behaviorConfiguration="Ajax2Behavior" binding="webHttpBinding" contract="IGadget"> <identity> <dns value="localhost" /> </identity> </endpoint>

<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> </services> <behaviors> <endpointBehaviors> <behavior name="AjaxBehavior"> <enableWebScript /> </behavior> </endpointBehaviors> <serviceBehaviors> <behavior name="GadgetBehavior"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> Tổ chức dự án thành ứng dụng n-tiers

Dự án có thể được tổ chức theo nhiều mô hình khác nhau. Trong dự án này, tôi tổ chức dự án theo mô hình n-tiers, bởi sự rõ ràng, dễ cài đặt và phù hợp với môi trường ASP 2.0.

Tầng UI: là các ứng dụng phía trình khách, có thể là các website khai thác dịch vụ, chương trình winform…

Tầng WCF Services: Triển khai xuất bản các hàm chức năng dưới dạng dịch vụ

Tầng Business: triển khai các chức năng trung gian từ tầng UI và DataAccess

Tầng DataAccess: Triển khai các chức năng thao tác trực tiếp với cơ sở dữ liệu Mối liên hệ giữa các tầng trong ứng dụng được mô tả theo sơ đồ sau:

Hình 23: Kiến trúc chương trình ứng dụng

Trước đây, việc trao đổi dữ liệu giữa trình khách và dịch vụ chỉ thực hiện trên các kiểu dữ liệu cơ bản như số nguyên, xâu, logic…hoặc nếu kiểu dữ liệu object thì việc

Client

Business Layer Data Contract

WCF services

Data Access Layer

Database Services

cài đặt cũng rất khó khăn. Với WCF, Datacontract được tạo ra như những object info, thuận lợi khi trao đổi dữ liệu kiểu đối tượng giữa Client và services.

Việc tạo ra các object này tương đối dễ dàng, để tạo ra một datacontract, chỉ cần thêm thẻ <Datacontract> trước mỗi class đối tượng cần publish, trước mỗi thuộc tính cần thêm thẻ <DataMember> nếu cần xuất bản thuộc tính này xuống phía Client.

Tầng WCFServices: Tổ chức dự án tường minh bằng cách khai báo các giao diện và các class thực thi giao diện này tương ứng.

Imports System.ServiceModel <ServiceContract()> _

Public Interface IStaff #Region "DMS_Groups"

Function DMS_Groups_GetById(ByVal Id As Integer) As _GroupInfo <OperationContract()> _

Function DMS_Groups_GetAll() As List(Of _GroupInfo) <OperationContract()> _

Function DMS_Groups_Insert(ByVal objInfo As _GroupInfo) As Integer <OperationContract()> _

Sub DMS_Groups_Delete(ByVal Id As Integer) <OperationContract()> _

Sub DMS_Groups_Update(ByVal objInfo As _GroupInfo) #End Region

Tạo DataContract

#Region "ObjectInfo" <DataContract()> _

Public Class _REQProjectInfo

Private _ContractId As Integer Private _AppendixTech As String Private _AppendixCost As String Private _Plan As String

<DataMember()> _

Public Property ContractId() As Integer Get

Return _ContractId End Get

Set(ByVal Value As Integer) _ContractId = Value End Set

End Property <DataMember()> _

Public Property AppendixTech() As String Get

Return _AppendixTech End Get

Set(ByVal Value As String) _AppendixTech = Value End Set

End Property

Tầng Business

Imports WcfService

Public Class Contract_BL #Region "DMS_Contract"

Public Function DMS_Contract_GetById(ByVal Id As Integer) As _ContractInfo

Dim ctr As New DMSContractController() Return ctr.GetById(Id)

End Function

Public Function DMS_Contract_GetAll() As List(Of _ContractInfo) Dim ctr As New DMSContractController()

Return ctr.GetAll() End Function

Public Function DMS_Contract_GetbyStaffId(ByVal id As Integer, ByVal type As Integer) As List(Of _ContractInfo)

Dim ctr As New DMSContractController() Return ctr.GetByStaffId(id, type)

End Function

Public Function DMS_Contracts_Insert(ByVal obj As _ContractInfo) As Integer

Dim ctr As New DMSContractController Return ctr.Insert(obj)

End Function

Tầng DataAccsess

#Region "DMS_Groups"

Public Overrides Function DMS_Groups_GetById(ByVal Id As Integer) As IDataReader

Return SqlHelper.ExecuteReader(ConnectionString, "DMS_Groups_SelectById", Id)

End Function

Public Overrides Function DMS_Groups_GetAll() As IDataReader Return SqlHelper.ExecuteReader(ConnectionString,

"DMS_Groups_SelectAll") End Function

Public Overrides Function DMS_Groups_Insert(ByVal objInfo As _GroupInfo) As Integer

Return CInt(SqlHelper.ExecuteScalar(ConnectionString,

"DMS_Groups_Insert", objInfo.Name, objInfo.Description, objInfo.Leader,

objInfo.DepartmentId)) End Function

Public Overrides Sub DMS_Groups_Update(ByVal objInfo As _GroupInfo)

SqlHelper.ExecuteNonQuery(ConnectionString,

"DMS_Groups_Update", objInfo.Id, objInfo.Name, objInfo.Description,

objInfo.Leader, objInfo.DepartmentId) End Sub

#End Region

Tầng UI

Tầng UI thực hiện các ứng dụng phía trình khách để gọi dịch vụ, đó có thể là các website khai thác dịch vụ hoặc các ứng dụng winform.

Public Class frmContract

Public Delegate Sub capnhat() Public Shared id As Integer

Private Sub btnThem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnThem.Click

Dim frm As New frmInputContract()

frm.capnhat = New capnhat(AddressOf getdata) frm.Show()

End Sub

Private Sub getdata()

Dim sv As New ContractService.Service3Client() _ContractInfoDataGridView.DataSource =

sv.DMS_Contracts_GetByStaffId(frmLogin.Staff, 1) sv.Close()

End Sub

Private Sub frmContract_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

getdata() End Sub

Xây dựng ứng dụng Gadget dùng JSON-AJAX

Trong chương trình này, tôi có thực hiện viết một ứng dụng gadget để gọi dịch vụ( Chương trình này có tham khảo video bài giảng gadget của Trịnh Minh Cường, giảng viên tại msdnvietnam).

var serviceURI = "http://gadget.com/Gadget.svc/" var photoURL = "http://gadget.com/photo/";

var timer; var LabelFullName; var LabelPosition; var Photo; var runShow; var job; var searchTags; document.onreadystatechange = function() { if (document.readyState == "complete") {

staffService = new StaffService(); //Construct StaffService object LabelFullName = document.getElementById("fullname"); LabelPosition = document.getElementById("position"); Photo = document.getElementById("photo"); job = document.getElementById("job"); System.Gadget.settingsUI = "Settings.htm"; System.Gadget.onUndock = resizeGadget; System.Gadget.onDock = resizeGadget; System.Gadget.Flýout.file = "flýout.html"; System.Gadget.onSettingsClosed = settingsClosed; runShow = true; staffService.getAllStaffIDs();

if (staffService.AllIDs != null) { //Check if AllIDs is not null if (staffService.AllIDs.length > 0) { showStaff(); } } searchTags = System.Gadget.Settings.read("searchTags"); if (searchTags='') { searchTags='admin'; } GetInfo(); } } function GetInfo() { if (timer == null) { timer = setInterval("GetInfo()", 2000); } staffService.GetInfo(); } function StaffService() { this.xmlHttp = CreateXmlHttpRequestObject(); this.AllIDs = new Array();

this.staff = null; this.day=null }

StaffService.prototype.getAllStaffIDs = function() { var currentTime = new Date();

this.xmlHttp.open("GET", serviceURI + "/getAllStaffIDs", false);

this.xmlHttp.send();

var temp = eval('(' + this.xmlHttp.responseText + ')'); this.AllIDs = temp.d;

}

StaffService.prototype.getRandomStaff = function() {

Một phần của tài liệu Tìm hiểu công nghệ WEC (Windows communication foundation) (Trang 42 - 60)

Tải bản đầy đủ (PDF)

(60 trang)