不過要請使用者每回都要選擇”以系統管理員身份執行”,的確是有些麻煩。經過網路找解法,試過 app.manifest 中設定 requireAdministrator,但程式仍直接被 Win10 關閉。最後找到直接寫 code 提示使用者需要系統管理員權限的題示畫面,但使用者只要按下 “是” 就可以執行。
以下 sample code 來源: https://dotblogs.com.tw/alexwang/2016/09/21/234628
[STAThread]
static void Main()
{
var wi = WindowsIdentity.GetCurrent();
var wp = new WindowsPrincipal(wi);
if (!wp.IsInRole(WindowsBuiltInRole.Administrator))
{
var processInfo = new ProcessStartInfo();
// The following properties run the new process as administrator
processInfo.UseShellExecute = true;
processInfo.FileName = Application.ExecutablePath;
processInfo.Verb = "runas";
// Start the new process
try
{
Process.Start(processInfo);
}
catch (Exception ex)
{
// The user did not allow the application to run as administrator
MessageBox.Show("Sorry, this application must be run as Administrator.\n" + ex.Message);
}
}
else
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form2());
}
}
需求: URL 輸入 http://xxxx/yyy 轉成 http://xxxx/yyy.html
最近趕流行,用 vue 寫了一個 SAP(Single application page),html網頁在 MVC 的架構下可成功執行,但我就是想讓使用者操作上更方便,只要輸入網址 route 就直接跳轉到此 html 頁面。如果照原本 MapHttpRoute的方式會造成 .NET 出現找不到 Controller 的問題。最後發現不用 MapHttpRoute 去解此問題,使用MapPageRoute才是正解。
// Web API routes
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
以下增加於 Global.asax.cs
public class Global : HttpApplication
{
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
GlobalConfiguration.Configure(WebApiConfig.Register);
// 新增加以下 route
RegisterRoutes(RouteTable.Routes);
}
void RegisterRoutes(RouteCollection routes)
{
routes.MapPageRoute("",
"yyy", "~/yyy.html");
}
}
Web.Config 加上對應的 extension
<compilation debug="true" targetFramework="4.5.2">
<buildProviders >
<add extension=".html" type="System.Web.Compilation.PageBuildProvider"/>
<add extension=".htm" type="System.Web.Compilation.PageBuildProvider" />
</buildProviders >
</compilation>
手上有個泰國的生產系統小案子,
雖說是個小案子但也算是跨國專案,
我遇到除了語言不同之外的電腦系統文化差異,
平常我們使用電腦的日期格式一般主要為2018/5/10,
美國系統的國家則是 5/10/2018,也就是 MM/dd/yyyy。
但泰國的使用曆別是一個本人未曾耳聞的佛曆,
就是釋迦牟尼佛滅度(涅槃)當年度為計算基準,
西元2018年就是泰曆/佛曆2561年,年度不同就算了還有四年一次閏年。
真要弄起來那就頭疼了。
不過在網路上找到一個小解法,
執行的程式強制指定CultureInfo,
為了這個設定我可是弄到凌晨三時多,真是工程師的悲哀。
以下為其語法,分享給作泰國專案的網友們。
string theCultureString = “zh-TW”; // 台灣南波萬
System.Globalization.CultureInfo ci = new CultureInfo(theCultureString);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
加碼再作個記錄,此專案使用到一個強大元件:GrapeCity Spread。
雖然事前設定CurrentThread的CultureInfo,
但日期資料在輸入時仍有被我佛慈悲的佛曆帶著走,
還是得強迫在 cell 設定CultureInfo處理日期。
// 強制使用台灣 Culture, 避免泰國佛曆造成衝突
string theCultureString = "zh-TW"
System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo(theCultureString); datecell.SetCurrentCulture(ci);
開發系統時,使用者常常會問可以知道資料是被那個員工更新的,更新什麼內容嗎?通常我都會回答系統會記錄Log時間,資料異動者都查詢的到,但是異動那一個欄位就沒辦法了,實在也不想為這個很少使用的功能再大費周張去寫程式作欄位比較再存到log去。
今天碰巧查個MSSQL的資料,才發現MSSQL 2008 就有類似的功能了,還不用寫程式作些設定就可以達到這個功能,以下就是這個CDC (Change Data Capture) 的簡單實測記錄。
-- CDC = Change Data Capture
-- 執行 CDC, sp_cdc_enable_table 為 enable, sp_cdc_disable_table 為 disable
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'items',
@role_name = NULL
GO
-- 觀察修改前、後差異
select * from cdc.dbo_items_CT
-- 目前 DB 中有那些 table 被 tracking
SELECT [name], is_tracked_by_cdc FROM sys.tablesGO
-- CCD 設定多久會清除, 預設為 4320 分鐘或 3 天, 最大值為 52494800 (100 年)
select retention, threshold
from msdb.dbo.cdc_jobs
where database_id = db_id()
and job_type = N'cleanup'
我手上有一個對外的網站是從幾年前就租用的美國Godaddy - Windows Hosting,當初租用Godaddy的原因及特點是無流量限制,檔案空間不限速度也還可以,但對我來說有個最致命的一點就是MySQL的DB容量限制,1GB。這個1GB搞的我很麻煩,系統資料庫每週都會更新資料,就會越長越大,但舊資料也不能刪除,所以一超過這個限制就提心吊膽會被Godaddy無情的封鎖。對,我曾經被封鎖過,還必須郵件往返才解決問題。
話說今年(2018)三月剛好租用的Godaddy Hostoing又要到期,心一橫來搬家。但Linux Hosting好找、Windows Hosting難尋,找了貴到離譜的台灣Hosting,系統爛還有流量限制,也試用價格不便宜的GCP,但C/P值都不理想。最後在某網站看到推薦SmartASP.Net,MySQL的限制是10GB,足足比Godaddy的1GB大了10倍,流量也不限制就連價格也差不多,所以我直接買了一般共用空間的最高等級Premium Plan,價格是漂亮的$7.95/月。
不過最重要的搬家花了不少時間處理MySQL技術問題,以下稍微作點記錄。
MySQL Connection限制
錯誤訊息:User 'a34322_n1' has exceeded the 'max_user_connections' resource (current value: 10)
原來SmartASP.Net的MySQL有Connection限制,但他們也太小看我的網站了,輕輕鬆鬆就突破這個限制,爆了。所以本來買的是.NET Advance plan就改昇級到Premium plan,價差不大可以接受。但請注意昇級後,要去按網站上的一個按鈕:[Upgrade to 20] <— 但…我的網頁上就沒這個按鈕,只能開Ticket請客服幫忙手動增加。以下是四個plan的connection限制,在Knowledge base才有得查。
- .NET Basic plan - 10 MAX
- .NET Advance plan - 10 MAX
- .NET Premium plan - 20 MAX
- Semi plans - 40 MAX
另外'max_user_connections' 也延伸出另一個問題,就是網站平時20個connection都是滿的,那平常要怎麼維護或是自動更新資料呢?因為大部份時間都被user佔滿了。原本以為又沒解了,但想了一夜後發現原來.NET Premium plan有開放一個功能”Extra DB Users”,有了這個金牌功能就可以另外再加DB user,而'max_user_connections'是跟著DB user走,所以開新DB User就有獨立的 connection 數可以用,就將系統用的DB user和維護的DB user分作不同帳號解決。