說明 : 佈版調整後,出現錯誤訊息
這個設定區段不能在這個路徑中使用。當區段在父層級被鎖定時就會發生這種情況。鎖定可能是預設 (overrideModeDefault="Deny"),或是由位置標記使用 overrideMode="Deny" 或繼承的 allowOverride="false" 明確設定。
解決 : 到控制台 –> 程式集 –> 開啟或關閉windows功能 –> 去開啟IIS內的 應用程式開發功能,跟asp有相關的打勾即可
說明 : 佈版調整後,出現錯誤訊息
這個設定區段不能在這個路徑中使用。當區段在父層級被鎖定時就會發生這種情況。鎖定可能是預設 (overrideModeDefault="Deny"),或是由位置標記使用 overrideMode="Deny" 或繼承的 allowOverride="false" 明確設定。
解決 : 到控制台 –> 程式集 –> 開啟或關閉windows功能 –> 去開啟IIS內的 應用程式開發功能,跟asp有相關的打勾即可
在開發winform,建置後會產生exe跟一些dll檔,如果要把debug測試版給其他人使用時,必須整包都傳給對方才行,相當不方便
因此可以使用IMerage來合併成一個exe,非常方便
IMerage 下載位置 https://goo.gl/PP5CN7
安裝完成後
1.先去設定環境變數,加入IMergae.exe的路徑
2.開啟命令提示字元
3.指向專案的exe.dll的資料夾
4.鍵入 ILMerge.exe /out:Merged.exe 你的exe.exe xxx.dll yyy.dll /targetplatform:v4,"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"
最後文字面是指定.net framework 4.0的組件
如何就會在剛剛的資料夾產生新的exe檔案囉!!
enjoy!
如果需要使用字串來動態設定屬性的值,可借用反射的方式來達成目的
var model = new Model();
var propertyName = "指定屬性";
Type type = model.GetType();
PropertyInfo propertyInfo = type.GetProperty(propertyName);
propertyInfo.SetValue(model, value);
//縮寫成一行
model.GetType().GetProperty(propertyName).SetValue(model, value);
問題 : 如何將Mon, 05 Dec 2016 轉成一般的datetime?
方法 :
var date = DateTime.ParseExact(Mon, 05 Dec 2016 , @"ddd, dd MMM yyyy", CultureInfo.InvariantCulture) .ToString("yyyy/MM/dd");
錯誤訊息 :
「接近 OFFSET 之處的語法不正確。FETCH 陳述式中的選項 NEXT 使用方式無效」
原因 :
使用ef6的skip,take時,轉成sql自動產生offset….語法,這在sql server 2008r2並不支援
解法 :
請到.edmx用xml開啟,搜尋2012如下圖,並改成2008 再重新編譯即可
身為工程師,我覺得必備的工具
要一致性、少打錯字,就靠他了 XD
https://msdn.microsoft.com/zh-tw/communitydocs/visual-studio/ta15021401
網站顯示時,有時需要限制多少文字長度,然後後面加上…的需求
以下是參考stackoverflow使用ng來解決 :
擴充一個filter :
angular.module('ng').filter('cut', function () {
return function (value, wordwise, max, tail) {
if (!value) return '';
max = parseInt(max, 10);
if (!max) return value;
if (value.length <= max) return value;
value = value.substr(0, max);
if (wordwise) {
var lastspace = value.lastIndexOf(' ');
if (lastspace != -1) {
//Also remove . and , so its gives a cleaner result.
if (value.charAt(lastspace-1) == '.' || value.charAt(lastspace-1) == ',') {
lastspace = lastspace - 1;
}
value = value.substr(0, lastspace);
}
}
return value + (tail || ' …');
};
});
使用上 :
{{some_text | cut:true:100:' ...'}}
參考 : http://stackoverflow.com/questions/18095727/limit-the-length-of-a-string-with-angularjs
<system.net> <mailSettings> <smtp deliveryMethod="Network"> <network defaultCredentials="false" host="smtp.gmail.com" port="25" enableSsl="true" userName="xx@gmail.com" password="xxcc" /> </smtp> </mailSettings> </system.net>
MailMessage mail = new MailMessage();
mail……內容設定
SmtpClient client = new SmtpClient();
client.Send(mail);
是不是更簡潔囉~
剛剛遇到客戶回饋說要在信中加入美化的畫面
但設計給的是一般的html 還引用js,css….
當然直接套入發信後,一片空白….
後來發現這篇文章說 :
https://css-tricks.com/using-css-in-html-emails-the-real-story/
要套css可以,但是要寫在dom物件內
也就是不能外連也不能使用<style></style>
撲吃…聽起來又要回到過去的感覺…
後來電話溝通後,發現是烏龍不是要在美化信件,是連出去的頁面要美化….XDDD
好家在!
<img-crop image="myImage" result-image="imgPath" area-type="rectangle" result-image-size="'max'" on-load-done="onLoadDone()"></img-crop>
檔案只要把ng-img-crop.js, ng-img-crop.css加入
並在app.module include ngImgCrop 即可使用他的directive囉
其他參考demoCodepen: Circle + Chargement Crop
string x = files.Replace("data:image/png;base64,", ""); // Convert Base64 String to byte[] byte[] imageBytes = Convert.FromBase64String(x); MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length); // Convert byte[] to Image ms.Write(imageBytes, 0, imageBytes.Length); System.Drawing.Image image = System.Drawing.Image.FromStream(ms, true); image.Save(fileMapPath, System.Drawing.Imaging.ImageFormat.Png);
var parseQueryString = function () { var str = window.location.search; var objURL = {}; str.replace( new RegExp("([^?=&]+)(=([^&]*))?", "g"), function ($0, $1, $2, $3) { objURL[$1] = $3; } ); return objURL; };
var params = parseQueryString(); console.log(params["id"]);
如下圖, 最近遇到資料更新時,因為資料表互相關連,造成無法更新的錯誤
原因 : 我的狀態在於automapping時, 會把子model 的父層屬性一起mapping,造成ef6更新時就報掉,
因此後來將父層屬性ignore 不要一起mapping即可
問題 : 先前要上傳大檔(500mb up)的影片,後來調整webconfig允許iis安全性後,又出現播放會out of memory
解法
參考 https://weblogs.asp.net/morteza/OutOfMemoryException
如圖下,把64位元版本開啟就ok了
整個專案移植時,發現如題的錯誤訊息
後來直接把bin跟obj內的資料砍掉重新編譯即可
想要過濾重複的list<T>物件, 在net3.0以上可以直接使用linq .Distinct()方法
List<T> Obj = Obj.Distinct().ToList();
using (ZipFile zips = new ZipFile(FileUpload.Path, Encoding.Default))
在一開始建立物件時,就決定編碼格式。
第二個:檔案內文字出現亂碼
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{language}/{controller}/{action}/{id}", defaults: new {language="chinese", controller = "Home", action = "Index", id = UrlParameter.Optional } ); } }
[TestInitialize] public void TestInitialize() { //arrange scope = new TransactionScope(); } [TestCleanup] public void TestCleanup() { scope.Dispose(); }
public class XmlHelper { public static TSource TryPareseXml<TSource>(string xmlString) { XmlSerializer serializer = new XmlSerializer(typeof(TSource)); TSource result; //反序列化 using (TextReader reader = new StringReader(xmlString)) { try { result = (TSource)serializer.Deserialize(reader); } catch (Exception) { return default(TSource); ; } return result; } } }
public class MyException : Exception, ISerializable { public MyException() : base("丟出自訂例外狀況") { } public MyException(string message) : base(message) { } public MyException(string message, Exception inner) : base(message, inner) { } protected MyException(SerializationInfo info, StreamingContext context) : base(info, context) { } }
<extensions> <add assembly="NLog.Extended"/> <add assembly="NLog.Web"/> </extensions>
private static Logger logger = LogManager.GetCurrentClassLogger();
以上
問題 :
本機run沒問題,但是發佈後卻出現上述問題,確認DLL都在沒有遺漏,那到底是什麼問題呢?
原因 :
1.先前佈版經驗是沒有問題,因此將webconfig互相比對
2.發現原來是release webconfig的metadata是沿用舊專案的資訊,所以跟webconfig有所出入= =
所以之後看到中繼資料無法載入除了dll要注意外還要注意connection是否完整
假設要取得每月20號的資訊,變數要如何設定呢?
DateTime FirstDay = new DateTime(DateTime.Now.Year,DateTime.Now.Month, 20);
同樣的,如果需要到小時分秒也ok
DateTime FirstDay = new DateTime(DateTime.Now.Year,DateTime.Now.Month, 20, 12, 0, 0);
最近遇到一些狀況,但卻被指出是專案上的問題,因為事件檢視器一直跳出
為了釐清問題,先將專案的警示關閉
<system.web>
<healthMonitoring enabled="false" />
</system.web>
使用Nest第三套件來操作Elastic
https://nest.azurewebsites.net/nest/quick-start.html 官方說明
var node = new Uri(" http://192.168.19.14:9200/"); var settings = new ConnectionSettings(node); var client = new ElasticClient(settings);
client1.Index<string>("Index", "Type", model.ID, json);
WITH K AS
( SELECT {0} FROM Data t where t.IsPublish = 1 {4} ORDER BY {0} {1} OFFSET ({2} - 1) * {3} ROWS FETCH NEXT {3} ROWS ONLY ) SELECT c.[ID] FROM dbo.Data AS c INNER JOIN K ON c.{0} = K.{0} ORDER BY c.{0} {1};
2. 之前使用的 ROW_NUMBER()
select * from ( SELECT t.ID, ROW_NUMBER() OVER ( ORDER BY t.{0} {1} ) RN FROM Data t where t.IsPublish = 1 {4} ) data WHERE RN BETWEEN {2} AND {3} ORDER BY RN";
資料來源http://www.ez2o.com/Blog/Post/csharp-Excel-NPOI-Font-Style
HSSFWorkbook workbook =
new
HSSFWorkbook();
HSSFSheet sheet = (HSSFSheet)workbook.CreateSheet(
"工作表名稱"
);
HSSFRow Row = (HSSFRow)sheet.CreateRow(0);
Row.CreateCell(0).SetCellValue(
"測試文字"
);
HSSFCellStyle cs = (HSSFCellStyle)workbook.CreateCellStyle();
//啟動多行文字
cs.WrapText =
true
;
//文字置中
cs.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.CENTER;
cs.Alignment = NPOI.SS.UserModel.HorizontalAlignment.CENTER;
//框線樣式及顏色
cs.BorderBottom = NPOI.SS.UserModel.BorderStyle.DOUBLE;
cs.BorderLeft = NPOI.SS.UserModel.BorderStyle.THIN;
cs.BorderRight = NPOI.SS.UserModel.BorderStyle.THIN;
cs.BorderTop = NPOI.SS.UserModel.BorderStyle.THIN;
cs.BottomBorderColor = NPOI.HSSF.Util.HSSFColor.GREY_50_PERCENT.index;
cs.LeftBorderColor = NPOI.HSSF.Util.HSSFColor.GREY_50_PERCENT.index;
cs.RightBorderColor = NPOI.HSSF.Util.HSSFColor.GREY_50_PERCENT.index;
cs.TopBorderColor = NPOI.HSSF.Util.HSSFColor.GREY_50_PERCENT.index;
//背景顏色
cs.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.GREY_25_PERCENT.index;
cs.FillPattern = NPOI.SS.UserModel.FillPatternType.SOLID_FOREGROUND;
HSSFFont font1 = (HSSFFont)workbook.CreateFont();
//字體顏色
font1.Color = NPOI.HSSF.Util.HSSFColor.DARK_BLUE.index;
//字體粗體
font1.Boldweight = (
short
)NPOI.SS.UserModel.FontBoldWeight.BOLD;
//字體尺寸
font1.FontHeightInPoints = 25;
cs.SetFont(font1);
Row.GetCell(0).CellStyle = cs;
最近遇到資料庫主Table有快兩百萬筆資料,然後join的資料表也是百萬級,我使用EF6來做資料查詢,結果一個查詢要5~8秒,實在是不符合需求阿!!
所以最好的改善方式就是加索引,先來看下面的圖
使用熱鍵ctrl + l 叫出執行計畫,SQLServer2014 很貼心會幫我們分析一句sql,我們可以看出哪邊的會花較多的成本,並建議我們加入索引(圖上綠色部分),真的很貼心。
依照建議加入索引後,再執行一次如下圖
有沒有發現,他的查詢成本變0%,同理我們在把大部分需要查詢的欄位以及常join的FK加入索引,就能很明顯的改善的查詢效能囉。
現在我的查詢速度又回到500ms以下,真是太令人開心了。
整理一下重點 :
用很久的sql server 2008r2 終於功成身退,換成sql2014 (其實是被逼的)
然後備份2008的db ,並刪除2008 安裝2014,再還原時發生錯誤!!
答案 :
其實最原始的錯誤好像不是上圖的錯誤,這是重製版QQ,內容比較像是說xxxx無法存取,
所以我就發現舊的DATA資料夾內還有原本DB檔案,必須把他移除才能重新還原成功
提供參考
以下展示簡易的方法 :
問題 :
在開發模式順利紀錄log但佈到iis 卻沒有東西
請檢查
1.NLog.config 點擊右鍵屬性,檢查複製到輸出目錄 是否為永遠複製
2.確定iis的資料夾有沒有權限寫入!
問題 :
winform 無法安裝或執行此應用程式…需要全域組件快取(GAC)安裝…
原因 :
原來是我auttomaper 在其他專案已經用nuget安裝了一版,後來在winform專案中include到其他專案,卻安裝最新版的automapper
導致發佈時,沒有把舊的套件加進來
解法 :
同步一致的套件即可,看是刪掉舊的或是都更新到最新即可
簡單記錄
DECLARE @SearchWord nvarchar(30)
SET @SearchWord = N'搜尋';
SELECT top 1000 * FROM Table
WHERE CONTAINS(*, @SearchWord)
//範例 ALTER TABLE {TABLENAME} ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL} CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}[WITH VALUES] //
//範例 ALTER TABLE MyTable ADD NewField int NOT NULL DEFAULT 10 //調整欄位結構 :
//調整欄位結構 ALTER TABLE ApplyInfo ALTER Column IsReserved int NOT NULL //
<script> (function (w, d, s, g, js, fs) { g = w.gapi || (w.gapi = {}); g.analytics = { q: [], ready: function (f) { this.q.push(f); } }; js = d.createElement(s); fs = d.getElementsByTagName(s)[0]; js.src = 'https://apis.google.com/js/platform.js'; fs.parentNode.insertBefore(js, fs); js.onload = function () { g.load('analytics'); }; }(window, document, 'script')); </script> <script> // 更多api 設定 // https://developers.google.com/analytics/devguides/reporting/core/dimsmets gapi.analytics.ready(function() { /** * Authorize the user immediately if the user has already granted access. * If no access has been created, render an authorize button inside the * element with the ID "embed-api-auth-container". */ gapi.analytics.auth.authorize({ 'serverAuth': { 'access_token': '從後台得到的token' } }); /** * Create a new ViewSelector instance to be rendered inside of an * element with the id "view-selector-container". */ var viewSelector = new gapi.analytics.ViewSelector({ container: 'view-selector-container' }); // Render the view selector to the page. viewSelector.execute(); /** * Create a new DataChart instance with the given query parameters * and Google chart options. It will be rendered inside an element * with the id "chart-container". */ var dataChart = new gapi.analytics.googleCharts.DataChart({ query: { metrics: 'ga:sessions', dimensions: 'ga:date', 'start-date': '30daysAgo', 'end-date': 'yesterday' }, chart: { container: 'chart-container', type: 'LINE', options: { width: '100%' } } }); /** * Render the dataChart on the page whenever a new view is selected. */ viewSelector.on('change', function(ids) { dataChart.set({query: {ids: ids}}).execute(); }); }); }); </script>
////// Google Analytics /// ///public string GetGoogleAnalyticsToken() { // Downloaded from https://console.developers.google.com //將自己的金鑰.p12檔放到app_data string[] scopes = new string[] { AnalyticsService.Scope.AnalyticsReadonly }; // view and manage your Google Analytics data var keyFilePath = HttpContext.Server.MapPath("~/App_Data/你的金鑰檔案名稱.p12"); var serviceAccountEmail = "你的服務帳號信箱"; //loading the Key file var certificate = new X509Certificate2(keyFilePath, "notasecret", X509KeyStorageFlags.Exportable); var credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(serviceAccountEmail) { Scopes = scopes }.FromCertificate(certificate)); //取得token string AuthenticationKey = ""; if (credential.RequestAccessTokenAsync(CancellationToken.None).Result) { AuthenticationKey = credential.Token.AccessToken; } return AuthenticationKey; }
前言 : 在第一篇我們已經準備好google開發者帳號的服務金鑰,接下來我們要把服務帳號的信箱加到Google Analytics
步驟一 : 登入Google Analytics網站 (請先註冊唷,簡單略過)
步驟二 : 將服務帳戶信箱加入使用者管理
點選管理 –> 選擇你先前建立的帳戶(略) –> 點選使用者管理 –> 把上一篇文章的gmail新增上去 –> 記得給予檢視與分析權限唷!!!
註 : 如果先前從未申請過網站,請記得在申請網站後把追蹤碼(script)加自己的網站唷
下一篇我們就會利用google api提供的api取得後端的token!!