說明 : 佈版調整後,出現錯誤訊息
這個設定區段不能在這個路徑中使用。當區段在父層級被鎖定時就會發生這種情況。鎖定可能是預設 (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!!