Design

Design
asp.net mvc

2018年9月19日 星期三

Selenium C# 簡單運用

Selenium 是為瀏覽器自動化(Browser Automation)需求所設計的一套工具集合,讓程式可以直接驅動瀏覽器進行各種網站操作。
應用的範圍滿廣泛的,除了自動化測試以外還可以當做爬蟲使用.
請NuGet 以下兩項
Selenium.Support
Selenium.WebDriver

底下簡單做個google搜訊範例 很直覺的啟動driver導頁到google 找search元件 輸入Submit 整體來說沒什麼難度 較進階的用法 會需要用到等待頁面加載完或是一些瀏覽器的問題跟操作 基本上大同小異

    using (var driver = new ChromeDriver())
            {
                driver.Navigate().GoToUrl("https://www.google.com.tw/");
                var search = driver.FindElementById("lst-ib");
                search.SendKeys("hi");
                search.Submit();
            }


我自己寫滿多的東西的,覺得目前來說各方面支援度都很夠用 推薦

2018年6月25日 星期一

懶得用DB 那就建個.json資料 來webapi CRUD吧

有時候懶得搞DB 這時候我們就可以本地建個JSON檔或是XML檔來當做資料庫
當然我不推崇這種方法 因為這會有很多問題 一方面效能 一方面資安 等等各種問題

那至於該怎做呢 方便我們前端呼叫做存取 這邊用webapi 當作範例
這邊依照飲料做為範例 先定義我們的Model格式吧





public class Type
    {
        public string Size { get; set; }
        public int Price { get; set; }
    }

    public class Drink
    {
        public int Drinkid { get; set; }
        public string DrinkName { get; set; }
        public List type { get; set; }
        public string Remarks { get; set; }
    }

    public class Blend
    {
        public string blendName { get; set; }
        public int Price { get; set; }
    }

    public class StoreModel
    {
        public int id { get; set; }
        public string StoreName { get; set; }
        public string Url { get; set; }
        public List Drink { get; set; }
        public List blend { get; set; }
        public string StoreRemarks { get; set; }
    }

再來就是簡單的CRUD 這邊自行看看吧 這邊都是邏輯都很簡單都是一照我們ID去找我們的資料再來重新復寫我們的資料

 public class StoreController : ApiController
    {

        [AllowAnonymous]
        [HttpPost]
        public List GetStore()
        {
            var mappedPath = System.Web.Hosting.HostingEnvironment.MapPath("~/Store/Store.json");

            return JsonConvert.DeserializeObject>(File.ReadAllText(mappedPath));

        }

        [AllowAnonymous]
        [HttpPost]
        public StoreModel GetStorebyID(int id)
        {
            var mappedPath = System.Web.Hosting.HostingEnvironment.MapPath("~/Store/Store.json");
            using (StreamReader r = new StreamReader(mappedPath))
            {
                string json = r.ReadToEnd();
                return JsonConvert.DeserializeObject>(json).Find(x => x.id == id);
            }
        }


        [AllowAnonymous]
        [HttpPost]
        public bool DeleteById(int id)
        {
            try
            {
                var mappedPath = System.Web.Hosting.HostingEnvironment.MapPath("~/Store/Store.json");
                var json = JsonConvert.DeserializeObject>(File.ReadAllText(mappedPath)).Find(x => x.id != id);
                var list = new List();
                list.Add(json);
                File.WriteAllText(mappedPath, JsonConvert.SerializeObject(list));
                return true;
            }
            catch (Exception e)
            {
                return false;
            }
        }

        [AllowAnonymous]
        [HttpPost]
        public bool Add(StoreModel StoreModel)
        {
            try
            {
                var mappedPath = System.Web.Hosting.HostingEnvironment.MapPath("~/Store/Store.json");
                var json = JsonConvert.DeserializeObject>(File.ReadAllText(mappedPath));
                json.Add(StoreModel);
                File.WriteAllText(mappedPath, JsonConvert.SerializeObject(json));
                return true;
            }
            catch (Exception e)
            {
                return false;
            }
        }

    }

這邊就簡單做個紀錄

2018年6月23日 星期六

vscode 起手vue cli

最近剛有新筆電 開始想寫些side project 經過一陣子的磨練發現自己寫工具的能力大大提升
心想那何不增加自己的github stat,剛好把這些過程稍微紀錄一下生篇文章給需要的人
vscode 算現在最潮的editor, vue 也從library漸漸發展成framework 那就開始吧

首先先安裝vscode吧
https://code.visualstudio.com/

再來安裝我們的nodejs
https://nodejs.org/en/
左邊LTS算是穩定版  右邊算是現在的版本
我們就選擇穩定版吧  這個看個人需求


再來就可以開始安裝我們的vue cli了
vue cli 可以幫助我們在開發vue上快速建立起我們的環境及基本的設定
相關文件可以參考
https://cli.vuejs.org/guide/


首先開啟我們的vscode 在我們的終端機開輸入我們以下語法
 
npm install -g @vue/cli



安裝完後我們就可以透過vue cli的建立起我們的專案

vue init webpack my-project



然後就會要你輸入一些東西 專案名阿 什麼的

幫方便的是他連webpack都自動幫你封裝好了
至於webapck有時間再來詳細說明
我們精美的範例就出來的



接下來我們把專案run起來吧
cd到我們的專案 然後輸入 npm run dev  就可以看到我們8080 port就有我們的vue基本畫面接下來就可以開心開發我們的vue 網頁了
 cd my-project
npm run dev


這是vue cli 最基本中的基本用法  , 未來在來分享些架構上的東西
有任何問題可以在底下留言

2017年11月14日 星期二

2017/11/14 近況

因為工作的關系 一直在寫前端,已經好一陣子沒回去碰.Net的東西,也很久沒更新blogger,雖然前端變強了...哈哈,回頭翻發現自己之前寫了很多code 原本要拿來寫文章的都難產了,近期應該會想慢慢再去回顧一下並開始寫一些相關blog.

其實前端我也想寫,不過近期前端各種framework版本變化太快,要寫的話可能就後面再來處理,目前還是想惡補一下.net的部分 很多東西以前寫過 現在想講卻一時沒辦法講出很好的解釋.

其實滿有趣的.前端後端 我到底比較偏好哪邊,我是哪邊都無法割捨
回顧的話自己也算有進步了,更多解釋更多邏輯,現在比較能從以前經驗裡找到答案
我很佩服固定在寫blog的各位微軟MVP始終保持熱情,甚至是當作人生中的一個不可或缺的部分,我想朝著你們邁進,也給自己一個期許.

Mars 
2017/11/14



處理好我們每次的Web Api吧 Web Api Handlers Message

什麼是Handlers Message?
message handler is a class that receives an HTTP request and returns an HTTP response.
Typically, a series of message handlers are chained together. The first handler receives an HTTP request, does some processing, and gives the request to the next handler. At some point, the response is created and goes back up the chain. This pattern is called a delegating handler.

這樣做有什麼好處呢
我們從中處理拿到的資料 或是紀錄我們之間傳輸的值 我們就不必傻傻的在每個controller或是其他地方寫相同的邏輯 這時候我們就可以透過這種方式做處理

簡單說如下圖

public class RequestAndResponseLoggerDelegatingHandler : DelegatingHandler
{
    public IDataAccess Data { get; set; }

    protected override async Task SendAsync(
                            HttpRequestMessage request, 
                                 CancellationToken cancellationToken)
    {
        var started = DateTime.UtcNow;
        var requestContent = await request.Content.ReadAsStringAsync();

        var response = await base.SendAsync(request, cancellationToken);

        var responseContent = await response.Content.ReadAsStringAsync();
        await Log(started, request, response, requestContent, responseContent);
        return response;
    }

    private async Task Log(DateTime start, HttpRequestMessage request, 
                             HttpResponseMessage response, string requestContent, 
                                string responseContent)
    {
        var finished = DateTime.UtcNow;           
        var info = new ApiLogEntry(start, finished, requestContent, responseContent, 
                                        request, response);
        Data.Log(info);
    }
}
最後我們在註冊到我剛剛所寫的方法 當然也可以註冊很多層
public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MessageHandlers.Add(new RequestAndResponseLoggerDelegatingHandler1());
        config.MessageHandlers.Add(new RequestAndResponseLoggerDelegatingHandler2());

        // Other code not shown...
    }
}
或者是我們在WebApiConfig綁定 特定的路徑 這都是不錯的處理方式
public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "Route1",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        config.Routes.MapHttpRoute(
            name: "Route2",
            routeTemplate: "api2/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional },
            constraints: null,
            handler: new MessageHandler2()  // per-route message handler
        );

        config.MessageHandlers.Add(new MessageHandler1());  // global message handler
    }
}
參考連結
https://stackoverflow.com/questions/27176329/web-api-request-content-empty 
https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/http-message-handlers

2017年6月11日 星期日

Google Cloud Platform VM 申請

Google Cloud Platform 也有段時間了,一直沒機會體驗它的強大

手邊剛好想做點東西需要架台虛擬機,但是又不想花錢

Google Cloud Platform 現在提供了一整年免費的試用,還包括註冊送你300美金做使用

根本佛心

就選擇最低效能的機器類型

0.6GB記憶體 1個CPU  每個月大概5塊美金 也夠你用很久了

2017年6月1日 星期四

C# Simple Factory Pattern簡單工廠

之前有提到Interface C#

再來我們進階提到 簡單工廠 這還滿常用到的

主要是建立個類別去負責分配要到哪個工廠做事情

我們可以在主邏輯分配 次要邏輯 要處理的事情

一方面可以增加可讀性 功能也不會雜亂的都寫在一起

2017年5月31日 星期三

C# Email Send SmtpClient

簡單郵件傳輸協定[編輯]

維基百科,自由的百科全書
簡單郵件傳輸協定 (Simple Mail Transfer Protocol, SMTP) 是事實上的在Internet傳輸email的標準。
SMTP是一個相對簡單的基於文字協定。在其之上指定了一條訊息的一個或多個接收者(在大多數情況下被確認是存在的),然後訊息文字會被傳輸。可以很簡單地通過telnet程式來測試一個SMTP伺服器。SMTP使用TCP埠25。要為一個給定的域名決定一個SMTP伺服器,需要使用MX (Mail eXchange) DNS
在八十年代早期SMTP開始被廣泛地使用。當時,它只是作為UUCP的補充,UUCP更適合於處理在間歇連線的機器間傳送郵件。相反,SMTP在傳送和接收的機器在持續連線的網路情況下工作得最好。
Sendmail是最早使用SMTP的郵件傳輸代理之一。到2001年至少有50個程式將SMTP實現為一個用戶端(訊息的傳送者)或一個伺服器(訊息的接收者)。一些其他的流行的SMTP伺服器程式包括了Philip Hazel的exim,IBM的Postfix, D. J. BernsteinQmail,以及Microsoft Exchange Server
由於這個協定開始是基於純ASCII文字的,它在二進位檔案上處理得並不好。諸如MIME的標準被開發來編碼二進位檔案以使其通過SMTP來傳輸。今天,大多數SMTP伺服器都支援8位元MIME擴充功能,它使二進位檔案的傳輸變得幾乎和純文字一樣簡單。
SMTP是一個「推」的協定,它不允許根據需要從遠端伺服器上「拉」來訊息。要做到這點,郵件用戶端必須使用POP3IMAP。另一個SMTP伺服器可以使用ETRN在SMTP上觸發一個傳送。


C# SmtpClient 透過smtp 寄信的功能 詳細功能如下紀錄一下 這邊已Gmail為例
 紀錄一下

2017年5月27日 星期六

Nlog trace code 追蹤你的code

Nlog?

一個非常好用的code trace library 怎樣好用呢
往往我們專案Debug 會去需要看我們的錯誤 localhost Deubg 當然沒什麼問題
但是如果我們網站已經上線或是已經在server的測試階段,我們後端引發前端的錯誤
你很難依照當前頁面去判斷,而且很常就是我localhost 沒問題啊 怎上server 就有問題.
這時候我們就需要去在我們的程式碼加上記錄錯誤訊息的方法 這時候就需要用到我們的nlog
不只記錄exception,你也可以當作操作紀錄去分析client端的操作.
而且我們不只本機可以記錄 還可以連接我們的db 或是連接例如slack,exceptionless

2017年5月26日 星期五

.NET Web API 入門

Web API 介紹
ASP.NET Web API 是一個架構,可輕易建置 HTTP 服務並擴及廣大的用戶端範圍,包括瀏覽器和行動裝置。 ASP.NET Web API 是一個想理平台,用以 .NET Framework 基礎建置 RESTful 應用程式。

至於什麼是RESTful ,我們要REST說起
REST(英文:Representational State Transfer,又稱具象狀態傳輸 or 具象狀態轉化)是Roy Thomas Fielding博士於2000年在他的博士論文[1] 中提出來的一種全球資訊網軟體架構風格,目的是便於不同軟體/程序在網絡(例如網際網路)中互相傳遞信息。

具象狀態傳輸 轉化?? 不禁冒出黑人問號
Representational State Transfer  我們可以拆開來解釋