SQL Server LocalDB 在 ASP.NET中的應(yīng)用介紹
我相信世界總是會向更好的方向發(fā)展,今年的維也納新年音樂會沒有往年的明星級指揮,但是它通過回歸奧地利的本質(zhì),以更傳統(tǒng)的聚合法則,讓過往的藝術(shù)家們一代代創(chuàng)造的燦爛,在新的指揮手中,迸發(fā)出更深邃的音節(jié)。在此,也祝大家新年快樂。
如同交響樂一樣,構(gòu)造軟件系統(tǒng)不一定必須某個強(qiáng)大的明星驅(qū)動,我們站在歷代ADO.NET的肩膀上,更好地回歸到SQL Server的核心開發(fā):SQL Server LocalDB 在 ASP.NET中的應(yīng)用。
使用SQL Server LocalDB的優(yōu)勢:
缺點(diǎn)與限制:
必須對服務(wù)器有完全控制權(quán)限,租用虛擬主機(jī)的用戶無法使用(但是目前一個VPS和虛擬主機(jī)的價(jià)錢差別也不大)。無法通過bin文件夾中放置DLL進(jìn)行綠色部署,服務(wù)器必須安裝SQL Server Express LocalDB。
首先我們必須明白怎樣管理數(shù)據(jù)庫,在SQL Server 2012管理工具中:

使用 (LocalDb)\v11.0 字符串來連接到當(dāng)前本機(jī)的 LocalDB運(yùn)行時(shí)環(huán)境。
.net framework早于4.0.2的情況下,直接使用命名管道來連接 LocalDB,例如:"Server=np:\\.\pipe\LOCALDB#F365A78E\tsql\query"
這一步與我們的開發(fā)環(huán)境設(shè)置關(guān)系不大,但是對于將來調(diào)試差錯,有很大幫助。
下面通過兩個步驟設(shè)置在ASP.NET中運(yùn)行LocalDB:
1:解決數(shù)據(jù)庫文件定位
使用連接字符串:connectionString="Data Source=(LocalDb)\v11.0; Initial Catalog=xxx;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\test666.mdf"。

我們把系統(tǒng)生成的數(shù)據(jù)庫文件,在管理工具中附加到SQL Server中,會看到程序自動創(chuàng)建了一個名為DBBases的表
以上幾點(diǎn)解決了基本的連接功能,Visual Studio 2012 與SQL Server 2012 Management Studio中調(diào)試通過。
但是,問題只解決了一半, 注意上面我用的是“vs2012”、“調(diào)試”這兩個詞語,目前我還沒說過在“IIS”中“運(yùn)行”。
2:IIS中的用戶權(quán)限問題
在visual studio 中調(diào)試項(xiàng)目,使用的是windows 本地用戶進(jìn)程,該進(jìn)程具有比較高的權(quán)限(一般情況下與Administrator無異)。
而要在 IIS 中實(shí)際運(yùn)行項(xiàng)目,執(zhí)行程序時(shí)windows7、2008、2008R2、Server 2012默認(rèn)都是使用ApplicationPoolIdentity進(jìn)程。
ApplicationPoolIdentity進(jìn)程的權(quán)限在本篇中不過多解釋,在這里你只要把它理解為一個權(quán)限非常低的用戶進(jìn)程(IIS_IUSRS組)即可。就算LocalDB是再怎么精簡的版本,它畢竟也是SQL Server,在最極端的情況下,需要經(jīng)歷“開啟sqlserver.exe進(jìn)程”、“創(chuàng)建數(shù)據(jù)庫”兩個步驟,不是ApplicationPoolIdentity進(jìn)程(IIS_IUSRS組)想做就做的。
解決辦法
1: 應(yīng)用程序池 – 高級設(shè)置 – 標(biāo)識, 以localsystem賬戶運(yùn)行。Localsystem進(jìn)程等同于本地administrator。
這樣的解決辦法最簡單,直接通過localSystem賬戶運(yùn)行進(jìn)程,一切煩惱瞬間化為烏有。但是隨之而來反面因素便是帶來了潛在安全威脅: 如果一個不懷善意的客戶端上傳了一段惡意代碼, 那么惡意代碼一旦獲得運(yùn)行機(jī)會,那么將是以administrator的權(quán)限運(yùn)行于服務(wù)器,這將意味著什么,不必多說。
2:通過AttachDBFile,掛接數(shù)據(jù)庫文件到更高的SQL Server版本解決問題。
LocalDB是真正的SQL Server,可以直接和其它版本SQL Server 無縫兼容,我們只需要把數(shù)據(jù)庫文件掛接到Express或更高版本SQL Server中,
僅僅是需要把:“Data Source=(LocalDb)\v11.0;”修改為: “Data Source=.\SQLExpress”,也可以解決一切煩惱了。這樣的做法雖然具備實(shí)際意義,但是與本文的主題關(guān)系不大,在此也不多描述了。
最后,基于安全因素的運(yùn)行建議:
1:直接使用localsystem運(yùn)行整個程序,只要不允許客戶端上傳文件,整套程序可以放心運(yùn)行。但是大多數(shù)情況下一個有意義的web程序都是允許客戶端上傳文件的,所以列舉一個上傳文件的解決辦法:
在用戶上傳文件時(shí),把文件放置到別的進(jìn)程空間中,運(yùn)行時(shí),通過外鏈(upload.abc.com)文件的辦法,達(dá)到了讓用戶文件運(yùn)行于絕對安全的進(jìn)程中。
2:與建議1相反,把涉及到數(shù)據(jù)庫操作的代碼封裝為服務(wù),通過WCF或Web API的自宿主功能,運(yùn)行在另一個安全進(jìn)程中(僅限本地連接),面向公眾的Web程序通過本地服務(wù)接口調(diào)用之,如此可以把一切安全因素最小化。(但是開發(fā)過程與維護(hù)會增加更高的復(fù)雜度)
相關(guān)文章
在 .NET Core 中使用 Diagnostics (Diagnostic Source) 記錄跟蹤信息
今天給大家講一下在 .NET Core 2 中引入的全新 DiagnosticSource 事件機(jī)制,為什么說是全新呢? 在以前的 .NET Framework 有心的同學(xué)應(yīng)該知道也有 Diagnostics,那么新的 .NET Core 中有什么變化呢?跟隨小編一起看看吧2021-06-06
Entity Framework使用Code First模式管理視圖
本文詳細(xì)講解了Entity Framework使用Code First模式管理視圖的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
asp.net中一款極為簡單實(shí)用的圖表插件(jquery)
這里介紹一款簡單實(shí)用的圖表插件,該圖表插件是基于jquery和jquery的插件 gchart很容易實(shí)現(xiàn)的,而gchart插件是封裝了google的圖表api 。2011-07-07
解析ABP框架中的數(shù)據(jù)傳輸對象與應(yīng)用服務(wù)
ABP框架是基于ASP.NET的Web開發(fā)框架,在ABP中應(yīng)用服務(wù)將領(lǐng)域邏輯暴露給展現(xiàn)層,展現(xiàn)層通過傳入數(shù)據(jù)傳輸對象參數(shù)來調(diào)用應(yīng)用服務(wù),而這里我們就來解析ABP框架中的數(shù)據(jù)傳輸對象與應(yīng)用服務(wù)2016-06-06
asp.net下XML的加密和解密實(shí)現(xiàn)方法
xml加密(XML Encryption)是w3c加密xml的標(biāo)準(zhǔn)。這個加密過程包括加密xml文檔的元素及其子元素,通過加密,xml的初始內(nèi)容將被替換,但其xml格式仍然被完好的保留。2010-02-02
ASP.NET Core使用SkiaSharp實(shí)現(xiàn)驗(yàn)證碼的示例代碼
本篇文章主要介紹了ASP.NET Core使用SkiaSharp實(shí)現(xiàn)驗(yàn)證碼的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12
asp.net實(shí)現(xiàn)數(shù)據(jù)從DataTable導(dǎo)入到Excel文件并創(chuàng)建表的方法
這篇文章主要介紹了asp.net實(shí)現(xiàn)數(shù)據(jù)從DataTable導(dǎo)入到Excel文件并創(chuàng)建表的方法,涉及asp.net基于DataTable的數(shù)據(jù)庫及excel操作相關(guān)技巧,需要的朋友可以參考下2015-12-12

