雜亂談


    堅持與保持熱情是一件很難的事,說實話有時候我也會質疑現在去深入學習一些技術有沒有用,因為心態有時候會太浮躁,為什么要談這個呢,因為從去年開始我聽到最多的就是這些問題。

工作

簡單先說說項目都用了哪些技術吧。

一.ASP.NET MVC

網站使用ASP.NET MVC 開發效率相對還是蠻快的,比如有如下的特性

1.使用模型的聲明式驗證 ,簡化了表單驗證

2.Razor視圖或單獨使用RazorEngine

3.攔截器 我習慣這樣稱呼,因為之前springmvc一般這樣稱呼,比如做一個自動登錄的驗證[cookies],全局的日志記錄等

4.路由也是蠻重要的一個東西,特別是對有潔癖的開發人員來說,比如你就是喜歡要每一個訪問的URL都要簡短並且有意義,或SEO實現類似/shanghai的URL等等(開始mvc4試了特性路由 http://attributerouting.net/),ASP.NET MVC 5.1 后已經支持,調試路由的工具 Install-Package routedebugger 等

5.返回匿名類JSON,局部視圖,擴展htmlhelper等等,這個功能非常方便,可以自定義擴展自己的方法

6.緩存 使用MvcDonutCaching ,功能還比原生的多一些,基本一致,另外緩存服務Redis或Couchbase

7.js與css的合並壓縮,Bundle 確實要方便很多,無需管理js的合並與樣式版本號問題

8.日志 使用了NLog個人感覺要筆log4j好很多,錯誤與異常級別記錄文本,window事件,db,email,基本滿足需求,另外Elman也是蠻好用

9.XSS 使用了AntiXSS,ValidateAntiForgeryToken 另外就是寫代碼的時候多注意

10.頁面性能,使用 MiniProfiler [http://www.asp.net/mvc/overview/performance/profile-and-debug-your-aspnet-mvc-app-with-glimpse]檢查調試頁面性能,貌似有時候會與 routedebugger 的樣式混亂

二. WEBAPI

APP的接口與一些常用的接口之前是使用WCF的Rest,后面感覺比較臃腫,就換成了WEBAPI, 個人非常喜歡這個,相比WCF比較輕量,好擴展,相比ASP.NET MVC我改進了一點東西image

1.使用Autofac作為IOC容器

2.使用特性路由定義接口URL

3.使用markdown書寫接口文檔

5.全局攔截器對參數約束驗證

6.自動生成/help參數文檔 Install-Package Microsoft.AspNet.WebApi.HelpPage

7.支持跨越訪問 Install-Package Microsoft.AspNet.WebApi.Cors

8.路由調試 WebApiRouteDebugger 執行過程跟蹤 Install-Package Microsoft.AspNet.WebApi.Tracing Update-Package Microsoft.AspNet.WebApi.WebHost

9.另外推薦個HTTP類庫Flurl.Http個人感覺要比.NET 4.5自帶的HttpClient要好用,支持Task異步 ;擴展方法 Z.ExtensionMethods類庫,包含大多數常用的擴展方法

例:

        /// <summary>
        /// 測試業務異步回調接口是否正確
         /// </summary>
        /// <param name="notifyUrl">業務服務地址</param>
        /// <returns></returns>
        [HttpPost]
        [Route("notify")]
        public async Task<IHttpActionResult> PostJsonAsync(string notifyUrl)
        {
            if (notifyUrl.IsNullOrEmpty() || !notifyUrl.Contains("http", StringComparison.OrdinalIgnoreCase)) return Ok(new { IsError = true, Msg = "NotifyUrl IS EMPTY", Data = string.Empty });
            //notifyUrl = notifyUrl.UrlDecode(System.Text.Encoding.UTF8);
            var payPal = new PayPalData
            {
                UserID = "test",
                Subject = "測試異步回調接口",
                OutTradeNO = "10086",
                CreateTime = DateTime.Now,
                GuidNO = Guid.NewGuid().ToString(),
                TotalFee = "0.01",
                Origin = "WEB"
            };
            try
            {
                var data = await notifyUrl.PostJsonAsync(payPal).ReceiveJson<WebAPIResponse>();
                logger.Info("PayPalController JsonAsync : " + payPal.SerializeJson(System.Text.Encoding.UTF8));
                if (data.IsError)
                {
                    return Ok(new { IsError = true, Msg = data.Msg, Data = data.Data });
                }
                return Ok(new { IsError = false, Msg = string.Empty, Data = payPal.SerializeJson(System.Text.Encoding.UTF8) });
            }
            catch (Exception ex)
            {
                return Ok(new { IsError = true, Msg = "PostJsonAsync Exception : " + ex.Message, Data = payPal.SerializeJson(System.Text.Encoding.UTF8) });
            }
        }

列:Filter

/// <summary>
    /// http://www.asp.net/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api
    /// http://www.asp.net/web-api/overview/error-handling/exception-handling
    /// </summary>
    public class ModelValidFilter : ActionFilterAttribute
    {
        /// <summary>
        /// 模型驗證
        /// </summary>
        /// <param name="actionContext"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public override Task OnActionExecutingAsync(HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken)
        {
            if (actionContext.ActionArguments.Values.FirstOrDefault().IsNull())
            {
                var data = new { IsError = true, Msg = "參數不能為空!", Data = string.Empty };
                actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK, data);
                return base.OnActionExecutingAsync(actionContext, cancellationToken);
            }
            if (!actionContext.ModelState.IsValid)
            {
                // 注意 !!!!: http://tmenier.github.io/Flurl/fluent-http/ HttpStatusCode.BadRequest 
                var data = new { IsError = true, Msg = actionContext.ModelState.Values.FirstOrDefault().Errors.FirstOrDefault().ErrorMessage, Data = actionContext.ModelState.Keys.FirstOrDefault() + " :參數驗證有誤!!!" };
                actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK, data);
                return base.OnActionExecutingAsync(actionContext, cancellationToken);
            }
            return base.OnActionExecutingAsync(actionContext, cancellationToken);
        }
    }

另外推薦一個開源的Markdown編輯器  https://pandao.github.io/editor.md/ ,可以集成到項目中,寫寫接口文檔。

image

三.StackExchange Dapper

推薦StackExchange的兩款開源項目 StackExchange.Redis (https://github.com/StackExchange/StackExchange.Redis) 與 Dapper

使用Dapper,操作數據庫的代碼相比更簡潔 ,同時也支持.NET 4.5 Task異步 ,示例具體git下來看下單元測試 https://github.com/StackExchange/dapper-dot-net ,不過要主要Dapper下的一個與MSSQL執行計划的問題 

Be careful with varchars in Dapper :http://www.codeproject.com/Articles/594133/BepluscarefulpluswithplusvarcharsplusinplusDapper

四. Quartz

使用了Quartznet,寄宿window服務,運行一直很穩定。如果想不想使用服務方式可以試試 Install-Package Hangfire 可以集成MVC或OWIN等。

活動

杭JS2014

去年參加了杭JS2014 ,基本就是分享一些關於nodejs相關的東西,不得不說阿里不僅僅是JAVA帝國還是前端江湖的締造者。

杭JS - 2014 JavaScript中國開發者大會: 2014-6-21 ~ 22

https://cnodejs.org/topic/53473dde502e5602740078bc

2014 杭JS大會 會議盛況與技術熱點現場報道(直播)

http://segmentfault.com/a/1190000000584556

杭JS 2014 演講視頻合集

https://cnodejs.org/topic/53bbc408a3ccaece73467f11

PyConChina 2014

PyCon2014 這個票是gitcafe送的,一些主題 linux的線程 協程 回調與上下文切換; py與機器學習很厲害的樣子;golang 的nsq消息列隊

shanghai-osc-meeting-2014

shanghai-osc-meeting   the docker way;go的持續集成

OSC上海源創會

http://115.29.174.111/shanghai-osc-meeting/

搭建服務

后面我還搭建了基於一個nodejs博客:http://115.29.174.111/ 與基於golang的git服務:http://115.29.174.111:3000/

現在

碼了這么多字,都是一些零碎的東西,感覺也沒啥主題,就是記錄一些經歷過程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM