菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
336
0

杂乱谈

原创
05/13 14:22
阅读数 27887

    坚持与保持热情是一件很难的事,说实话有时候我也会质疑现在去深入学习一些技术有没有用,因为心态有时候会太浮躁,为什么要谈这个呢,因为从去年开始我听到最多的就是这些问题。

工作

简单先说说项目都用了哪些技术吧。

一.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/

现在

码了这么多字,都是一些零碎的东西,感觉也没啥主题,就是记录一些经历过程。

发表评论

0/200
336 点赞
0 评论
收藏